RFR: 8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
Erik Österlund
erik.osterlund at oracle.com
Tue Feb 20 16:41:25 UTC 2018
Hi Per,
(looping in hotspot-dev as this seems to touch more than runtime)
On 2018-02-20 17:03, Per Liden wrote:
> Hi Erik,
>
> As we discussed, coming up with a good name for the new Access call is
> really hard. All good/descriptive alternatives I can come up with tend
> to be way to long. So, next strategy is to pick something that fits
> into the reset of the API. With this in mind I'd like to suggest we
> just name it: oop Access<>::resolve(oop obj)
>
> The justification would that this this matches the one-verb style we
> have for the other functions (load/store/clone) and it seems that you
> anyway named the internal parts just "resolve", such as
> BARRIER_RESOLVE, and resolve_func_t.
Sure.
Here is a full webrev with my proposal for this RFE, now that we agree
on the direction:
http://cr.openjdk.java.net/~eosterlund/8198286/webrev.00/
Incremental from the prototype I sent out for early turnaround yesterday:
http://cr.openjdk.java.net/~eosterlund/8198286/webrev.00_inc/
It is now enforced that *_addr_raw() functions are to be used by the GC
only, when the GC knows addresses are stable. All other address
resolution goes through non-raw address resolution functions that at a
lower level end up calling the resolve barrier on Access, which can be
overridden by Shenandoah. There are in total two callers of
Access<>::resolve: on oopDesc::field_addr and arrayOop::base. The rest
is derived from that.
@Roman: Hope this works well for Shenandoah.
@Per: Hope you like the new shorter name.
Thanks,
/Erik
> What do you think?
>
> cheers,
> Per
>
> On 02/19/2018 06:08 PM, Erik Osterlund wrote:
>> Hi Roman,
>>
>> I see there is a need to resolve a stable address for some objects to
>> bulk access primitives. The code base is full of assumptions that no
>> barriers are needed for such address resolution. It looks like the
>> proposed approach is to one by one hunt down all such callsites. I
>> could find some places where such barriers are missing.
>>
>> To make the code as maintainable as possible, I would like to propose
>> a slightly different take on this, and would love to hear if this
>> works for Shenandoah or not. The main idea is to annotate places
>> where we do *not* want GC address resolution for internal pointers to
>> objects, instead of where we want it, as it seems to be the common
>> case that we do want to resolve the address.
>>
>> In some more detail:
>>
>> 1) Rip out the *_addr fascilities not used (a whole bunch on oopDesc).
>> 2) Ignore the difference between read/write resolution (write
>> resolution handles both reads and writes). Instead introduce an oop
>> resolve_stable_addr(oop) function in Access. This makes it easier to
>> use.
>> 3) Identify as few callsites as possible for this function. I'm
>> thinking arrayOop::base() and a few strange exceptions.
>> 4) Identify the few places where we explicitly do *not* want address
>> resolution, like calls from GC, and replace them with *_addr_raw
>> variants.
>> 5) Have a switch in barrierSetConfig.hpp that determines whether the
>> build needs to support not to-space invariant GCs or not.
>>
>> With these changes, the number of callsites have been kept down to
>> what I believe to be a minimum. And yet it covers some callsites that
>> you accidentally missed (e.g. jvmciCodeInstaller.cpp). Existing uses
>> of the various *_addr fascilities can in most cases continue to do
>> what they have done in the past. And new uses will not be surprised
>> that they accidentally missed some barriers. It will be solved
>> automagically.
>>
>> Webrev:
>> http://cr.openjdk.java.net/~eosterlund/typearray_resolve/webrev.00/
>>
>> Please let me know what you think about this style and whether that
>> works for you or not. I have not done proper testing yet, but
>> presented this patch for quicker turn-around so we can synchronize
>> the direction first.
>>
>> Thanks,
>> /Erik
>>
>>> On 16 Feb 2018, at 17:18, Roman Kennke <rkennke at redhat.com> wrote:
>>>
>>> The direct memory accessors in typeArrayOop.hpp, which are usually
>>> used for bulk memory access operations, should use the Access API, in
>>> order to give the garbage collector a chance to intercept the access
>>> (for example, employ read- or write-barriers on the target array).
>>> This also means it's necessary to distinguish between write-accesses
>>> and read-accesses (for example, GCs might want to use a
>>> copy-on-write-barrier for write-accesses only).
>>>
>>> This changeset introduces two new APIs in access.hpp: load_at_addr()
>>> and store_at_addr(), and links it up to the corresponding X_get_addr()
>>> and X_put_addr() in typeArrayOop.hpp. All uses of the previous
>>> X_addr() accessors have been renamed to match their use (load or store
>>> of primitive array elements).
>>>
>>> The changeset is based on the previously proposed:
>>> http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2018-February/026426.html
>>>
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~rkennke/8198286/webrev.00/
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8198286
>>>
>>> Please review!
>>>
>>> Thanks,
>>> Roman
More information about the hotspot-dev
mailing list