RFR: 8265753: Remove manual JavaThread transitions to blocked [v4]

Robbin Ehn rehn at openjdk.java.net
Thu May 20 07:19:35 UTC 2021


On Thu, 20 May 2021 05:14:43 GMT, David Holmes <dholmes at openjdk.org> wrote:

>> Robbin Ehn has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision:
>> 
>>  - Review fixes
>>  - Merge branch 'master' into 8265753
>>  - Fixes for Dan
>>  - Merge branch 'master' into 8265753
>>  - Removed manual transitions
>
> src/hotspot/share/runtime/interfaceSupport.inline.hpp line 236:
> 
>> 234: 
>> 235: template <typename PRE_PROC>
>> 236: class ThreadBlockInVMPreprocess : public ThreadStateTransition {
> 
> Can we add a comment before this template definition please:
> 
> // Perform a transition to _thread_blocked and take a call-back to be executed before 
> // SafepointMechanism::process_if_requested when returning to the VM. This allows us
> // to perform an "undo" action if we might block processing a safepoint/handshake operation
> // (such as thread suspension).

Fixed

> src/hotspot/share/runtime/interfaceSupport.inline.hpp line 245:
> 
>> 243:     // Once we are blocked vm expects stack to be walkable
>> 244:     thread->frame_anchor()->make_walkable(thread);
>> 245:     thread->set_thread_state(_thread_blocked);
> 
> This is a pre-existing issue. Everywhere we call make_walkable and then call plain set_thread_state (other than on PPC/Aarch64 which do a release_store) we are at risk of the thread_state update being reordered with stores related to making the stack walkable. Potentially allowing the VMThread (or other thread) to walk a stack that is not yet walkable! The original ObjectMonitor::enter code was aware of this:
> `current->frame_anchor()->make_walkable(current);`
> `// Thread must be walkable before it is blocked.`
> `// Read in reverse order.`
> `OrderAccess::storestore();`
> `for (;;) {`
> `  current->set_thread_state(_thread_blocked);`

Good catch, fixed.

> src/hotspot/share/runtime/objectMonitor.hpp line 309:
> 
>> 307:    protected:
>> 308:     ObjectMonitor* _om;
>> 309:     bool _exited;
> 
> For consistency with raw monitor code this would be _om_exited

Fixed

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

PR: https://git.openjdk.java.net/jdk/pull/3875


More information about the hotspot-runtime-dev mailing list