RFR: 8254264: Remove redundant cross_modify_fence()
Patricio Chilano
patricio.chilano.mateo at oracle.com
Thu Oct 15 18:09:43 UTC 2020
Hi David,
On 10/15/20 5:22 AM, David Holmes wrote:
> Hi Patricio,
>
> On 15/10/2020 1:20 am, Patricio Chilano Mateo wrote:
>> Hi all,
>>
>> Please review the following patch that removes some uneeded uses of
>> cross_modify_fence() in common code, in particular
>> from ~ThreadBlockInVM(), ~ThreadBlockInVMWithDeadlockCheck() and
>> java_suspend_self_with_safepoint_check(). These fences
>> were added before each JavaThread had to disarm itself (8230594).
>> After a safepoint/handshake each JavaThread will
>> always call SafepointMechanism::process_if_requested_slow() when
>> transitioning out of the safe state and will execute a
>> cross_modify_fence(). Tested with mach5 tiers1-7.
>
> As you have already done the analysis, could you show the exact call
> sequences that allow for the removal of the code as described? I'm
> trying to verify what you've stated but trying to reverse engineer the
> calling sequences is painful. :)
So, before each JavaThread had to disarm itself you could have the
following sequence:
- JT T creates ThreadBlockInVM object and then blocks (usually in
park()/wait())
- VMThread arms T for a safepoint operation. Since T is in
_thread_blocked state it's safe so safepoint starts.
- Once safepoint operation is done VMThread disarms T
- T wakes up and executes ~ThreadBlockInVM(). Since the poll word/page
is not armed it just continues execution. If we didn't have that
cross_modify_fence() in ~ThreadBlockInVM() we can transition back to
java later without executing the fence instruction.
Same sequence with ~ThreadBlockInVMWithDeadlockCheck and
java_suspend_self_with_safepoint_check(). So when transitioning out of
the _thread_blocked state a JT wouldn't know if a safepoint happened so
we had that fence there unconditionally.
Today disarming of the poll word/page is done by each JT, so if a
safepoint happened while the JT was blocked the poll word/page will
remain armed. The JT when transitioning out of the _thread_blocked will
call SafepointMechanism::process_if_requested() (in
~TBIVM/~TBIVMWDC/java_suspend_self_with_safepoint_check()), will go
through process_if_requested_slow() to check if it needs to process some
operation and at the end will execute a cross_modify_fence().
Patricio
> Thanks,
> David
>
>> Thanks,
>> Patricio
>>
>> -------------
>>
>> Commit messages:
>> - v1
>>
>> Changes: https://git.openjdk.java.net/jdk/pull/655/files
>> Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=655&range=00
>> Issue: https://bugs.openjdk.java.net/browse/JDK-8254264
>> Stats: 5 lines in 2 files changed: 0 ins; 5 del; 0 mod
>> Patch: https://git.openjdk.java.net/jdk/pull/655.diff
>> Fetch: git fetch https://git.openjdk.java.net/jdk
>> pull/655/head:pull/655
>>
>> PR: https://git.openjdk.java.net/jdk/pull/655
>>
More information about the hotspot-runtime-dev
mailing list