RFR (S) 8182397: Race in field updates when creating ArrayKlasses can lead to crash

Andrew Dinn adinn at redhat.com
Fri Jul 21 13:47:02 UTC 2017

Hi Coleen,

On 21/07/17 00:44, coleen.phillimore at oracle.com wrote:
> Summary: Update array_klass field in component mirror after
> klass.java_mirror field for concurrent readers in compiled code.
> See bug for details.
> open webrev at http://cr.openjdk.java.net/~coleenp/8182397.01/webrev
> bug link https://bugs.openjdk.java.net/browse/JDK-8182397
> Ran tier1 testing with -Xcomp and without.  Thank you to Tom for the
> test and diagnosis.
The re-ordering of the writes to

  . . .
  set_array_klass(comp_mirror(), k);

is all that is needed, assuming that the second write has release
semantics. I discussed this with Andrew Haley and he confirmed my
assumption (also Tom's) that on AArch64 there is no need for a load
acquire on the reader side because of the address dependency between any
load of the component mirror's array klass k and ensuing load of k's mirror.

However, I think your implementation of method
metadata_field_put_volatile() is overkill. You have

void oopDesc::metadata_field_put_volatile(int offset, Metadata* value) {
  *metadata_field_addr(offset) = value;

That fence() will impose a full memory barrier which is more than is
actually needed. It should be ok just to use another release.

void oopDesc::metadata_field_put_volatile(int offset, Metadata* value) {
  *metadata_field_addr(offset) = value;

Alternatively, I believe you could implement the assign of using a call
to OrderAccess::store_release_ptr which would achieve the same outcome
on AArch64.


Andrew Dinn
Senior Principal Software Engineer
Red Hat UK Ltd
Registered in England and Wales under Company Registration No. 03798903
Directors: Michael Cunningham, Michael ("Mike") O'Neill, Eric Shander

More information about the hotspot-dev mailing list