RFR: 8230661: ZGC: Stop reloading oops in load barriers
erik.osterlund at oracle.com
erik.osterlund at oracle.com
Tue Nov 12 15:39:16 UTC 2019
Hi Stefan,
Thanks for the review. I will file an RFE about the proposed
enhancements (which I agree about).
/Erik
On 11/12/19 4:05 PM, Stefan Karlsson wrote:
> Hi,
>
> This looks good to me.
>
> As a separate patch, I think that we should:
>
> 1) swap places between the calls to ZResurrection::unblock and
> _unload.purge(). There every stale weak/phantom reference has been
> cleaned out at this point, and there's no need to hold the
> resurrection blocked windows open longer than necessary.
>
> 2) change the implementation of ZResurrection to use
> Atomic::load/store now that we rely on the handshakes to prevent
> someone from having a weak oop to a "dead" object while finding out
> that the resurrection has been unblocked.
>
> Thanks,
> StefanK
>
> On 2019-11-11 21:41, Per Liden wrote:
>> Erik, Stefan and I discussed the original patch and agreed to make
>> some adjustments. The changes are:
>>
>> 1) Broke out self healing logic into ZBarrier::self_heal(), and
>> restructured ZBarrier::barrier() and ZBarrier::weak_barrier() to use
>> that function.
>>
>> 2) Made sure the slow path is only ever executed once, even when self
>> healing is re-applied.
>>
>> 3) In the resurrection blocked window, allow weak oop refs to be
>> healed to the good state, not just the remapped state.
>>
>> 4) Moved the handshake in ZUnload::unload() out into ZHeap, to make
>> it more front-and-center, since it's no longer just needed for class
>> unloading.
>>
>> Diff: http://cr.openjdk.java.net/~pliden/8230661/webrev.1-diff
>> Full: http://cr.openjdk.java.net/~pliden/8230661/webrev.1
>> Testing: Passed tier 1-7
>>
>> With these adjustments this patch looks good to me!
>>
>> cheers,
>> Per
>>
>> On 10/28/19 5:44 PM, Erik Österlund wrote:
>>> Oops. CR link was a bug link. For anyone that couldn't figure out
>>> what the CR link could possibly be, here it is:
>>> http://cr.openjdk.java.net/~eosterlund/8230661/webrev.00/
>>>
>>> /Erik
>>>
>>> On 2019-10-28 17:38, Erik Österlund wrote:
>>>> Hi,
>>>>
>>>> In ZGC, an oop is first loaded somewhere, by e.g. JIT compiled
>>>> code. Then it passes a load barrier that typically does not take a
>>>> slow path. But when it does take a slow path, the oop is sometimes
>>>> reloaded, at historically three different places, and now two places.
>>>>
>>>> 1) We used to do that as part of the mechanism that transferred
>>>> execution to the slow path because it was easier to write that stub
>>>> code if the original oop died. Since then, the compiler slow paths
>>>> have been rewritten to not reload the oop.
>>>>
>>>> 2) Once in the slow path, we sometimes reload weak oops during the
>>>> resurrection block window, because there used to be a race when it
>>>> closed. After concurrent class unloading integrated, there is a
>>>> thread-local handshake before closing the resurrection block
>>>> window. Therefore, that race no longer exists (when class unloading
>>>> is used).
>>>>
>>>> 3) Once the final oop of a slow path has been determined,
>>>> self-healing kicks in. The self-healing CAS may fail. When it does,
>>>> the oop is reloaded. But this is completely unnecessary.
>>>>
>>>> With obstacle 1 gone, and 2 and 3 having no reason to be in the
>>>> code any more, I propose to get rid of all reloading of the oops in
>>>> the slow paths, so that it becomes easier to reason about the code.
>>>> The object captured by the original load, is then always the same
>>>> object as the object found after the load barrier completes,
>>>> although possibly with a new bit representation.
>>>>
>>>> Bug:
>>>> https://bugs.openjdk.java.net/browse/JDK-8230661
>>>>
>>>> CR:
>>>> https://bugs.openjdk.java.net/browse/JDK-8230661
>>>>
>>>> Thanks,
>>>> /Erik
>>>
More information about the hotspot-gc-dev
mailing list