8214257: IC cache not clean after cleaning assertion failure
authoreosterlund
Wed, 05 Dec 2018 16:11:53 +0100
changeset 52858 dad45affbdaa
parent 52857 7e268f863ff0
child 52859 413c28945e0f
8214257: IC cache not clean after cleaning assertion failure Reviewed-by: kvn, thartmann
src/hotspot/share/code/compiledIC.cpp
src/hotspot/share/runtime/sharedRuntime.cpp
--- a/src/hotspot/share/code/compiledIC.cpp	Wed Dec 05 15:57:26 2018 +0100
+++ b/src/hotspot/share/code/compiledIC.cpp	Wed Dec 05 16:11:53 2018 +0100
@@ -126,7 +126,6 @@
 
   {
     CodeBlob* cb = CodeCache::find_blob_unsafe(_call->instruction_address());
-    MutexLockerEx pl(CompiledICLocker::is_safe(cb->as_compiled_method()) ? NULL : Patching_lock, Mutex::_no_safepoint_check_flag);
     assert(cb != NULL && cb->is_compiled(), "must be compiled");
     _call->set_destination_mt_safe(entry_point);
   }
@@ -374,7 +373,7 @@
 
   // A zombie transition will always be safe, since the metadata has already been set to NULL, so
   // we only need to patch the destination
-  bool safe_transition = _call->is_safe_for_patching() || !in_use || is_optimized() || CompiledICLocker::is_safe(_method);
+  bool safe_transition = _call->is_safe_for_patching() || !in_use || is_optimized() || SafepointSynchronize::is_at_safepoint();
 
   if (safe_transition) {
     // Kill any leftover stub we might have too
@@ -427,8 +426,7 @@
   if (info.to_interpreter() || info.to_aot()) {
     // Call to interpreter
     if (info.is_optimized() && is_optimized()) {
-       assert(is_clean(), "unsafe IC path");
-       MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
+      assert(is_clean(), "unsafe IC path");
       // the call analysis (callee structure) specifies that the call is optimized
       // (either because of CHA or the static target is final)
       // At code generation time, this call has been emitted as static call
@@ -602,7 +600,6 @@
   // in_use is unused but needed to match template function in CompiledMethod
   assert(CompiledICLocker::is_safe(instruction_address()), "mt unsafe call");
   // Reset call site
-  MutexLockerEx pl(SafepointSynchronize::is_at_safepoint() ? NULL : Patching_lock, Mutex::_no_safepoint_check_flag);
   set_destination_mt_safe(resolve_call_stub());
 
   // Do not reset stub here:  It is too expensive to call find_stub.
@@ -648,7 +645,6 @@
 
 void CompiledStaticCall::set(const StaticCallInfo& info) {
   assert(CompiledICLocker::is_safe(instruction_address()), "mt unsafe call");
-  MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
   // Updating a cache to the wrong entry can cause bugs that are very hard
   // to track down - if cache entry gets invalid - we just clean it. In
   // this way it is always the same code path that is responsible for
--- a/src/hotspot/share/runtime/sharedRuntime.cpp	Wed Dec 05 15:57:26 2018 +0100
+++ b/src/hotspot/share/runtime/sharedRuntime.cpp	Wed Dec 05 16:11:53 2018 +0100
@@ -1059,7 +1059,7 @@
 
   address pc = vfst.frame_pc();
   { // Get call instruction under lock because another thread may be busy patching it.
-    MutexLockerEx ml_patch(Patching_lock, Mutex::_no_safepoint_check_flag);
+    CompiledICLocker ic_locker(caller);
     return caller->attached_method_before_pc(pc);
   }
   return NULL;
@@ -1765,7 +1765,7 @@
     {
       // Get call instruction under lock because another thread may be
       // busy patching it.
-      MutexLockerEx ml_patch(Patching_lock, Mutex::_no_safepoint_check_flag);
+      CompiledICLocker ml(caller_nm);
       // Location of call instruction
       call_addr = caller_nm->call_instruction_address(pc);
     }
@@ -1940,9 +1940,8 @@
   if (moop->code() == NULL) return;
 
   if (nm->is_in_use()) {
-
     // Expect to find a native call there (unless it was no-inline cache vtable dispatch)
-    MutexLockerEx ml_patch(Patching_lock, Mutex::_no_safepoint_check_flag);
+    CompiledICLocker ic_locker(nm);
     if (NativeCall::is_call_before(return_pc)) {
       ResourceMark mark;
       NativeCallWrapper* call = nm->call_wrapper_before(return_pc);