RFR: Deoptimization bug

Roman Kennke rkennke at redhat.com
Thu Oct 4 20:01:01 UTC 2018


Let's turn this into a proper fix and RFR. I think a better and
simpler/less intrusive fix is the one below (JDK12, JDK11 and JDK8),
e.g. WB all oops from deoptimization before entering slow_enter(). All
other paths to slow_enter() should have the WB already (that only
happens when coming from interpreter/C1/C2).

Tests: tier3_gc_shenandoah

Aleksey, can you verify that it helps our failing tests too? So far I
failed to setup those lucene tests...

JDK11/12:

diff --git a/src/hotspot/share/runtime/deoptimization.cpp
b/src/hotspot/share/runtime/deoptimization.cpp
--- a/src/hotspot/share/runtime/deoptimization.cpp
+++ b/src/hotspot/share/runtime/deoptimization.cpp
@@ -1098,7 +1098,7 @@
     if (mon_info->eliminated()) {
       assert(!mon_info->owner_is_scalar_replaced() || realloc_failures,
"reallocation was missed");
       if (!mon_info->owner_is_scalar_replaced()) {
-        Handle obj(thread, mon_info->owner());
+        Handle obj(thread, Access<>::resolve(mon_info->owner()));
         markOop mark = obj->mark();
         if (UseBiasedLocking && mark->has_bias_pattern()) {
           // New allocated objects may have the mark set to anonymously
biased.


JDK8:
diff --git a/src/share/vm/runtime/deoptimization.cpp
b/src/share/vm/runtime/deoptimization.cpp
--- a/src/share/vm/runtime/deoptimization.cpp
+++ b/src/share/vm/runtime/deoptimization.cpp
@@ -990,7 +990,7 @@
     if (mon_info->eliminated()) {
       assert(!mon_info->owner_is_scalar_replaced() || realloc_failures,
"reallocation was missed");
       if (!mon_info->owner_is_scalar_replaced()) {
-        Handle obj = Handle(mon_info->owner());
+        Handle obj =
Handle(oopDesc::bs()->write_barrier(mon_info->owner()));
         markOop mark = obj->mark();
         if (UseBiasedLocking && mark->has_bias_pattern()) {
           // New allocated objects may have the mark set to anonymously
biased.

Roman


Am 04.10.18 um 21:44 schrieb Roman Kennke:
> We've observed a rather nasty bug in some tests in jdk8u lately. From
> what I can tell, this affects all versions though. I am not 100% sure
> that what I'm thinking is correct, so let me describe it for further
> discussion.
> 
> Deoptimization happens at safepoints. It may happen at a safepoint in
> the middle of concurrent evac. In fact (but this is not really relevant
> for the fix I think), evac threads might continue to run concurrently
> with the deopt-safepoint. (We do have an option to make GC workers
> synchronize at safepoints too, we might consider this.)
> 
> Deoptimization generates valid interpreter frames out of compiled
> frames. One of the funny things it needs to do is recreate locks that
> the compiler has eliminated (via escape analysis). In order to do this,
> it creates a bunch of compiledVFrame objects that get populated with
> on-stack-objects (or sometimes new objects, because it also needs to
> recreate objects that have been eliminated because of escape analysis).
> Those on-stack-objects may be from-space-copies. If such a
> from-space-copy is subsequently passed to slow_enter() (to re-create the
> lock), it will take the from-space-mark and write that into the
> displaced header. This blows up later, of course.
> 
> A possible quick fix for this may be:
> http://cr.openjdk.java.net/~rkennke/fix-locking.patch
> 
> But I'm not really happy with it. We probably should comb through
> deoptimization.cpp and find the right places where we need to apply WB.
> 
> Roman
> 



More information about the shenandoah-dev mailing list