RFR: 8166188: G1 Needs pre barrier on dereference of weak JNI handles

Coleen Phillimore coleen.phillimore at oracle.com
Fri Feb 10 02:34:23 UTC 2017


http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/src/cpu/x86/vm/sharedRuntime_x86_32.cpp.udiff.html
http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/src/cpu/x86/vm/sharedRuntime_x86_64.cpp.udiff.html
http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/src/cpu/x86/vm/templateInterpreterGenerator_x86.cpp.udiff.html

The code to unpack the oop result is the same at least for the x86 
implementations, which unfortunately still have 32/64 bit variants for 
sharedRuntime_x86.cpp.   So in the x86 case, there are 3.  I think these 
should be refactored into a function in macroAssembler_x86.cpp, 
something like unpack_native_oop_result(). It's not technically unboxing 
because boxing refers to making primitives into java.lang.Integer, etc 
objects.

Sorry that this might be more work and tricky for the other platforms 
because I didn't diff them, but it would be a lot better.   Maintaining 
separate copies of assembly code is a lot of work too.  You can file an 
RFE/bug to clean this up if there was not a reason for the duplication 
because of ZBB.

http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/src/share/vm/prims/jni.cpp.udiff.html

Can you change 'l' to obj?  never mind, I see why you picked 'l' but it 
looks like a 1.

http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/src/share/vm/runtime/javaCalls.hpp.udiff.html

I see what you've done.   These are terrible casts.

+ JNITypes::put_obj((oop)handle, _value, size); // Updates size.


I think as a future cleanup, we should make JNITypes::put_obj take 
(intptr_t) or (jobject,Handle) instead of dealing with the oop class for 
CheckUnhandledOops.  I didn't see any other callers except this one.

Why is value_state uint when it's being stored into uchar?

+ static const uint value_state_primitive = 0;


Could they be enums near where _value_state_buffer is declared?

http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/src/share/vm/runtime/jniHandles.hpp.udiff.html

I don't think it's good to have to include

+#include "gc/g1/g1SATBCardTableModRefBS.hpp"


in jniHandles.hpp header file.

could you refactor resolve_impl to put the jweak case in the .cpp file?  
I don't think performance is going to be important for jweak.  All this 
work for an indirection.  With the template code, it's hard to see 
that's all it is. :(

http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04/test/runtime/jni/ReturnJNIWeak/ReturnJNIWeak.java.html

Someone else asked this question but how can you assume that GC cleared 
the weak reference?

  115           System.gc();
  116           // Verify weak ref cleared as expected.


That's all.  The change looks good.

Thanks,
Coleen


On 2/6/17 8:03 PM, Kim Barrett wrote:
> Apologies for taking so long to respond to earlier comments.  I've
> been distracted by some other tasks, and it took a while to figure out
> what to do about the problem Mikael reported.
>
> Martin Doerr - Thanks for the ppc and s390 native call generator
> modifications.  Do you want a contributed-by credit when pushed?
>
> Andrew Haley - Thanks for the syntax fix.  The new version with always
> tagged jweaks (see below) makes testing easier, and there's a new test
> included.  Testing the G1-specific behavior still needs the whitebox
> extension.  I've updated the G1-specific test (which is still not part
> of the changeset for JDK 9).
>
> Per Liden - I tried your suggestion of making jweak unconditionally
> tagged.  It doesn't eliminate much of the INCLUDE_ALL_GCS
> conditionals, since those are still needed to protect references to
> G1-specific code.  (The littering of otherwise generic runtime code
> with this G1-specific stuff should be a cleanup task for JDK 10.)
> However, it does simplify some of the code, and simplifies testing.
> The cost is a "bit-test and (predicted taken) conditional branch" in
> the handling of an oop result from a native call.  I agree that's
> unlikely to be noticable, and the benefits seem worthwhile, so I've
> made that change.
>
> I've attempted to update the platform-specific native call return
> handling changes for all of the platforms, including those I don't
> have access to (aarch64, ppc, s390).  I also fixed the zero change I'd
> made earlier.  And I made shark error, to force anyone using it to fix
> the handling of an oop result by SharkNativeWrapper::initialize().
> There might be other zero/shark changes that I've missed.  All of
> these should be checked by appropriate platform experts.
>
> I had to fix a JVMTI bug as part of this; FollowReferences wasn't
> doing as much argument checking as expected.  This was unconvered by a
> closed test that unexpectedly asserted.  This test would have
> similarly asserted previously if CheckJNICalls was true; I removed
> that conditionalization in JNIHandles::resolve, as it was only there
> to avoid an expensive check for the jobject being a jweak, and in the
> new code we already know it isn't.  There might be other JVMTI
> functions with similar issues.
>
> Mikael - There are some ugly worms lurking under that rock!  I think
> I've dealt with the problem, tripping over some other bugs along the
> way.  Thanks for the test case.  I tweaked it a bit and included it in
> the updated changeset.
>
> The passing of arguments involves collecting them into a
> JavaCallArguments object.  oop arguments are in some handlized form
> (either jobject or Handle).  The existing code heavily cheats; for
> example, it assumes one can correctly cast from a jobject to an oop*
> and dereference that pointer.  Obviously, a tagged jweak breaks that
> assumption.  Even worse, there are casts from oop* to oop and back!
> (These are so nasty they *must* use C-style cast syntax.) I'm thinking
> about some followup cleanup bugs in that area.
>
> To address this, I changed JavaCallArguments to avoid conversions
> from jobject to Handle/oop*.  To support that, it now keeps more
> accurate track of the state of the object references in the collected
> arguments.  It also delays resolving jobjects to their designated
> oops, avoiding intermediate Handle objects.  (This was a place where
> cheating was going on, in order to avoid intermediate Handle
> allocations.  We're now accomplishing that without crashing through
> the JNIHandles abstraction.)
>
> CR:
> https://bugs.openjdk.java.net/browse/JDK-8166188
>
> New webrevs:
> full: http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04
> incr: http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04.inc
> The full webrev may be more useful than the incremental; some of the
> incremental changes are pretty hard to read.
>
> Some additional webrevs that might be helpful:
> http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04.other-platforms
> Incremental changes for aarch64, ppc, and s390 supplied by Andrew and
> Martin.
>
> http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04.always_tag[.full]
> Incremental [full] changes to always tag jweaks.
> The full webrev may be more useful than the incremental; some of the
> incremental changes are pretty hard to read.
>
> http://cr.openjdk.java.net/~kbarrett/8166188/hotspot.04.java_call
> Incremental changes to address the java call problem found by Mikael.
>
> hotspot.04 == hotspot.02 + hotspot.04.inc
> hotspot.04 == hotspot.04.always_tag.full + hotspot.04.java_call
> hotspot.04 == hotspot.02 + hotspot.04.other-platforms +
>                hotspot.04.always_tag + hotspot.04.java_call
>
> The updated G1-specific test requiring the whitebox extension is
> http://cr.openjdk.java.net/~kbarrett/8166188/test.04
>
> The whitebox extension has not changed:
> http://cr.openjdk.java.net/~kbarrett/8166188/whitebox/hsroot.01/
> http://cr.openjdk.java.net/~kbarrett/8166188/whitebox/hotspot.01/
>
>



More information about the hotspot-dev mailing list