RFR: 8154750: Add missing OrderAccess operations to ClassLoaderData lock-free data structures
David Holmes
david.holmes at oracle.com
Fri May 27 21:58:44 UTC 2016
On 28/05/2016 6:59 AM, Kim Barrett wrote:
>> On May 26, 2016, at 11:39 PM, David Holmes <david.holmes at oracle.com> wrote:
>>
>> Hi Kim,
>>
>> Updated webrev:
>>
>> http://cr.openjdk.java.net/~dholmes/8154750/webrev.v2/
>
> ------------------------------------------------------------------------------
> src/share/vm/classfile/classLoaderData.cpp
> 363 // lock-free iteration will either see k or k->next_link, both
> 364 // of which are stable
>
> I think this new comment isn't needed, given Stefan's reply and your
> plan to add an assert_locked_or_safepoint to this function.
If that works out yes. A JPRT run without the lock and an assertion for
being at a safepoint passed but I need to run more tests. I'd also like
Coleen to chime in. :)
> ------------------------------------------------------------------------------
> src/share/vm/classfile/classLoaderData.cpp
> 210 void ClassLoaderData::packages_do(void f(PackageEntry*)) {
> 211 assert_locked_or_safepoint(Module_lock);
>
> Lock mismatch. CLD::packages() protects _packages using the
> metaspace_lock().
It is the same check that CLDG::packages_do() uses - I just copied the
assertions into the CLD methods. But you are right this is a problem.
When I started work on this I queried about the different locks used in
different places:
"The purpose of the Module_lock is to protect access to module specific
JVM data structures including the ModuleEntryTables and
PackageEntryTables. Each ClassLoaderData has its own instances of these
two tables but they can be accessed by multiple threads.
The metaspace lock, in this case, is used when creating these tables and
storing their addresses in the classLoaderData's _modules and _packages
fields."
So basically the metaspace lock controls creation of the tables but once
created they are modified under the modules lock. But the
ModuleEntryTable creation actually needs both.
What does that mean for our memory ordering issues? It means that if
packages_do() is called with the Modules_lock, then it need not
synchronize with a thread lazily creating the package table under the
Modules lock. So I can remove the assert in CLD::packages_do and have to
initially read _packages with load_ptr_acquire.
Well spotted! I'll recheck the other cases as well.
Thanks,
David
> ------------------------------------------------------------------------------
>
More information about the hotspot-runtime-dev
mailing list