[aarch64-port-dev ] RFR: aarch64: minor improvements of atomic operations
Yangfei (Felix)
felix.yang at huawei.com
Tue Nov 12 02:57:37 UTC 2019
> On 11/11/19 3:05 PM, Andrew Haley wrote:
> > And finally, is there any operation in HotSpot that actually requires
> > such strong memory semantics? Probably not, but no-one has ever been
> > brave enough to say so.
>
> Here's a place where it really does matter.
>
> void ShenandoahPacer::restart_with(size_t non_taxable_bytes, double
> tax_rate) {
> size_t initial = (size_t)(non_taxable_bytes * tax_rate) >> LogHeapWordSize;
> STATIC_ASSERT(sizeof(size_t) <= sizeof(intptr_t));
> Atomic::xchg((intptr_t)initial, &_budget);
> Atomic::store(tax_rate, &_tax_rate);
> Atomic::inc(&_epoch);
>
> Note: the xchg is conservative, the store is plain. The xchg value should be
> visible before the store.
Thanks for explaining this. I see your point now.
For memory_order_conservative order, looks like that ppc enforced an order which is stronger than aarch64.
ppc issues two full memory barriers: one before the loop and one after the loop.
But for aarch64, the preceding load/store can still floating after the first ldxr instruction :
.L2:
ldxr x2, [x1]
add x2, x2, x0
stlxr w3, x2, [x1]
cbnz w3, .L2
dmb ish
So my question is: for "two-way memory barrier", do we need another full barrier before the loop?
Felix
More information about the hotspot-dev
mailing list