RFR: 8319797: Recursive lightweight locking: Runtime implementation [v18]

Coleen Phillimore coleenp at openjdk.org
Sun Feb 11 19:27:56 UTC 2024


On Thu, 8 Feb 2024 10:37:13 GMT, Axel Boldt-Christmas <aboldtch at openjdk.org> wrote:

>> Implements the runtime part of JDK-8319796.
>> The different CPU implementations are/will be created as dependent pull requests.
>> 
>> This enhancement proposes introducing the ability for LM_LIGHTWEIGHT to handle consecutive recursive monitor enter. Limiting the implementation to only consecutive monitor enters allows for more efficient emitted code which only needs to look at the two top most entires on the lock stack to determine what to do in a monitor exit.
>> 
>> A high level overview:
>>   * Locking is still performed on the mark word
>>     * Unlocked (0b01) <=> Locked (0b00)
>>   * Monitor enter on Obj with mark word Unlocked (0b01) is the same
>>     * Transition Obj's mark word Unlocked (0b01) => Locked (0b00)
>>     * Push Obj onto the lock stack
>>     * Success
>>   * Monitor enter on Obj with mark word Locked (0b00) will check the top entry on the lock stack
>>     * If top entry is Obj
>>       * Push Obj on the lock stack
>>       * Success
>>     * If top entry is not Obj
>>       * Inflate and call ObjectMonitor::enter
>>   * Monitor exit on Obj with mark word Locked (0b00) will check the two top entries on the lock stack
>>     * If just the top entry is Obj
>>       * Transition Obj's mark word Locked (0b00) => Unlocked (0b01)
>>       * Pop the entry
>>       * Success
>>     * If both entries are Obj
>>       * Pop the top entry
>>       * Success
>>     * Any other case only occurs for unstructured locking, then just inflate and call ObjectMonitor::exit
>>   * If the monitor has been inflated for object Obj which is owned by the current thread
>>     * All corresponding entries for Obj is removed from the lock stack
>>     * The monitor recursions is set to the number of removed entries - 1
>>     * The owner is changed from anonymous to the thread
>>     * The regular ObjectMonitor::action is called.
>
> Axel Boldt-Christmas has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 54 commits:
> 
>  - Running out of LogTagSets, stick with monitorinflation
>  - Merge remote-tracking branch 'upstream_jdk/master' into JDK-8319797
>  - Merge remote-tracking branch 'upstream_jdk/master' into JDK-8319797
>  - Fix assert comment
>  - Update copyright
>  - Merge remote-tracking branch 'upstream_jdk/master' into JDK-8319797
>  - Add verify calls
>  - Assert valid lock stack offset
>  - Typos, wording and whitespace
>  - Fix miss in is_recursive improvement
>  - ... and 44 more: https://git.openjdk.org/jdk/compare/1fb9e3d6...6f76413d

We have done performance testing on the recursive locking implementation vs the existing lightweight locking implementation, and the results were much better on some worst cases, like J2DBench, reduces monitor inflation, and neutral on others, with a couple of small regressions on linux-aarch64 (Derby) that we will investigate as further work before making LM_LIGHTWEIGHT the default.  We at Oracle feel that this PR is ready for integration.  It's a nice implementation and improvement and great work.  Thank you!
This applies to the x86 and aarch64 implementation PRs as well, and we're looking forward to seeing the riscv and ppc ports and results from these platforms also.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/16606#issuecomment-1937844874


More information about the hotspot-dev mailing list