Make moving space compaction concurrent using userfaultfd

Bug: 160737021
Test: art/test/testrunner/testrunner.py
Change-Id: I09d9d49ddb4472a6864fdb7f32da5ffb7bc60c30
diff --git a/runtime/jit/jit_code_cache.cc b/runtime/jit/jit_code_cache.cc
index 6c83741..199a00b 100644
--- a/runtime/jit/jit_code_cache.cc
+++ b/runtime/jit/jit_code_cache.cc
@@ -1594,16 +1594,21 @@
 }
 
 void JitCodeCache::VisitRoots(RootVisitor* visitor) {
-  MutexLock mu(Thread::Current(), *Locks::jit_lock_);
-  UnbufferedRootVisitor root_visitor(visitor, RootInfo(kRootStickyClass));
-  for (ArtMethod* method : current_optimized_compilations_) {
-    method->VisitRoots(root_visitor, kRuntimePointerSize);
-  }
-  for (ArtMethod* method : current_baseline_compilations_) {
-    method->VisitRoots(root_visitor, kRuntimePointerSize);
-  }
-  for (ArtMethod* method : current_osr_compilations_) {
-    method->VisitRoots(root_visitor, kRuntimePointerSize);
+  Thread* self = Thread::Current();
+  gc::Heap* const heap = Runtime::Current()->GetHeap();
+  if (heap->CurrentCollectorType() != gc::CollectorType::kCollectorTypeCMC
+      || !heap->MarkCompactCollector()->IsCompacting(self)) {
+    MutexLock mu(self, *Locks::jit_lock_);
+    UnbufferedRootVisitor root_visitor(visitor, RootInfo(kRootStickyClass));
+    for (ArtMethod* method : current_optimized_compilations_) {
+      method->VisitRoots(root_visitor, kRuntimePointerSize);
+    }
+    for (ArtMethod* method : current_baseline_compilations_) {
+      method->VisitRoots(root_visitor, kRuntimePointerSize);
+    }
+    for (ArtMethod* method : current_osr_compilations_) {
+      method->VisitRoots(root_visitor, kRuntimePointerSize);
+    }
   }
 }