RFR (S): 8186787: clang-4.0 SIGSEGV in Unsafe_PutByte

David Holmes david.holmes at oracle.com
Thu Nov 30 04:44:48 UTC 2017


+1 :)

David

On 29/11/2017 11:48 PM, Erik Österlund wrote:
> Hi Kim,
> 
> I know how you feel about casts, and I also saw how Andrew Haley wanted 
> a more explicit comment about why it needs to be volatile.
> To make both of you happy, I thought I'd try to make the address 
> (addr()) in MemoryAccess volatile T*. That way I can write a more 
> explicit comment about why it is volatile in one single place, and make 
> you happier to not cast the address to something else than it was declared.
> 
> I hope this makes both of you happy. If not, I am okay with the old 
> variant too, and write a comment that I copy around instead.
> 
> Full webrev:
> http://cr.openjdk.java.net/~eosterlund/8186787/webrev.01/
> 
> Incremental webrev:
> http://cr.openjdk.java.net/~eosterlund/8186787/webrev.00_01/
> 
> Thanks,
> /Erik
> 
> On 2017-11-28 21:30, Kim Barrett wrote:
>>> On Nov 27, 2017, at 7:36 AM, Erik Österlund 
>>> <erik.osterlund at oracle.com> wrote:
>>>
>>> Hi,
>>>
>>> There is currently a bug when using unsafe accesses off-heap:
>>>
>>> 1) We write into a thread that we enable crash protection (using 
>>> GuardUnsafeAccess):
>>> 2) We perform the access
>>> 3) We write into a thread that we disable crash protection (using 
>>> ~GuardUnsafeAccess)
>>>
>>> The problem is that the crash protection stores are volatile, but the 
>>> actual access is non-volatile. Compilers have different 
>>> interpretation whether volatile - non-volatile accesses are allowed 
>>> to reorder. MSVC is known to interpret such interactions as-if the 
>>> volatile accesses have acquire/release semantics from the compiler 
>>> point of view, and others such as GCC are known to reorder away freely.
>>>
>>> To prevent any issues, the accesses involved when using 
>>> GuardUnsafeAccess should be at least volatile.
>>> This change makes the few remaining ones volatile. The JMM-volatile 
>>> (SEQ_CST) accesses with crash protection already have stronger 
>>> ordering than volatile and hence do not need changing.
>>>
>>> By making the address passed in to the Access API volatile, the 
>>> MO_VOLATILE decorator is automatically set, which not surprisingly 
>>> makes the access volatile. Therefore, the solution is to simply make 
>>> the address passed in to Access volatile in this case.
>>>
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8186787
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~eosterlund/8186787/webrev.00/
>>>
>>> Thanks,
>>> /Erik
>> Not my first choice for a fix (you know how I feel about casts), but
>> it works, and is currently much simpler than my preferred solution.
>>
>> Should there be a comment justifying the cast to volatile?  Perhaps
>> something like "volatile to keep access within guarded scope."  I
>> don't need a new webrev if you add such a comment.
>>
>> Looks good.
>>
> 


More information about the hotspot-runtime-dev mailing list