RFR(xs): 8211387: [Zero] atomic_copy64: Use ldrexd for atomic reads on ARMv7

David Holmes david.holmes at oracle.com
Mon Oct 8 21:26:56 UTC 2018


Hi Severin,

On 9/10/2018 2:20 AM, Severin Gehwolf wrote:
> Hi!
> 
> On Sun, 2018-10-07 at 07:52 +1000, David Holmes wrote:
>> On 7/10/2018 6:11 AM, dean.long at oracle.com wrote:
>>> On 10/5/18 5:18 PM, David Holmes wrote:
>>>> On 6/10/2018 12:18 AM, Andrew Haley wrote:
>>>>> On 10/05/2018 02:40 PM, Severin Gehwolf wrote:
>>>>>>> Also I thought that if ldrex was not paired with a strex then you
>>>>>>> should
>>>>>>> at least issue clrex - as done in generate_atomic_load_long() in
>>>>>>> stubGenerator_arm.cpp
>>>>>>
>>>>>> I'll defer to Andrew Haley for this.
>>>>>
>>>>> I'm skeptical that CLREX is necessary. The classic CAS for Arm is
>>>>>
>>>>>       MOV  R1, #0xFF             ; load the ?lock taken? value
>>>>> try LDREX    R0, [LockAddr]    ; load the lock value
>>>>>       CMP R0,  #0                ; is the lock free?
>>>>>       STREXEQ  R1, R0, [LockAddr]; try and claim the lock
>>>>>       CMPEQ R0, #0               ; did this succeed?
>>>>>       BNE try                    ; no ? try again. . .
>>>>> ; yes ? we have the lock
>>>>>
>>>>> There's no CLREX, and no-one ever reported any problem. CLREX could be
>>>>> a performance boost because it takes the cache line out of exclusive
>>>>> state back to shared state, reducing later bus traffic.
>>>>
>>>> I would see CLREX as a potential performance boost not something
>>>> needed for correctness. But you're right that failure paths from
>>>> typical CAS code won't execute the strex and don't include a clrex.
>>>>
>>>
>>> I think it's needed for correctness only at context-switch time.  If you
>>> context switch after the LDREX, you don't want the exclusive state to
>>> remain for the next thread scheduled.
>>
>> See also:
>>
>> https://community.arm.com/processors/f/discussions/6572/synchronization-primitives-do-i-need-clrex
>>
>> Seems if CLREX is needed for correctness it is at the OS level.
>>
>> On performance concern see:
>>
>> http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20150921/300951.html
>>
>> Bottom line seems to be:
>> - clrex is not essential
>> - clrex is probably not harmful to performance
>> - clrex may benefit performance
> 
> OK. David, how would you like me to update the webrev then?

Based on other responses your original is probably fine, but as you've 
already gone to the trouble ...

> 2a)
> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8211387/webrev.02_a/

this one is fine.

Thanks,
David

> 2b)
> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8211387/webrev.02_b/
> 
> FWIW, the performance gain for Zero is probably negligible, but it
> probably won't hurt either...
> 
> Thanks,
> Severin
> 


More information about the hotspot-dev mailing list