RFR(L): 8195142: Refactor out card table from CardTableModRefBS to flatten the BarrierSet hierarchy

Erik Österlund erik.osterlund at oracle.com
Thu Feb 22 11:45:29 UTC 2018


Hi Vladimir,

Thank you for having a look at this.

I created some utility functions in ci/ciUtilities.hpp to get the card 
table:

jbyte* ci_card_table_address()
template<T> T ci_card_table_address_as()

The compiler code has been updated to use these helpers instead to fetch 
the card table in a consistent way.

Hope this is kind of what you had in mind?

New full webrev:
http://cr.openjdk.java.net/~eosterlund/8195142/webrev.03/

New incremental webrev:
http://cr.openjdk.java.net/~eosterlund/8195142/webrev.02_03/

Thanks,
/Erik

On 2018-02-21 18:12, Vladimir Kozlov wrote:
> Hi Erik,
>
> I looked on compiler and aot changes. I noticed repeated sequence in 
> several files to get byte_map_base()
>
> +  BarrierSet* bs = Universe::heap()->barrier_set();
> +  CardTableModRefBS* ctbs = barrier_set_cast<CardTableModRefBS>(bs);
> +  CardTable* ct = ctbs->card_table();
> +  assert(sizeof(*(ct->byte_map_base())) == sizeof(jbyte), "adjust 
> this code");
> +  LIR_Const* card_table_base = new LIR_Const(ct->byte_map_base());
>
> But sometimes it has the assert (graphKit.cpp) and sometimes does not 
> (aotCodeHeap.cpp).
>
> Can you factor this sequence into one method which can be used in all 
> such places?
>
> Thanks,
> Vladimir
>
> On 2/21/18 3:33 AM, Erik Österlund wrote:
>> Hi Erik,
>>
>> Thank you for reviewing this.
>>
>> New full webrev:
>> http://cr.openjdk.java.net/~eosterlund/8195142/webrev.02/
>>
>> New incremental webrev:
>> http://cr.openjdk.java.net/~eosterlund/8195142/webrev.01_02/
>>
>> On 2018-02-21 09:18, Erik Helin wrote:
>>> Hi Erik,
>>>
>>> this is a very nice improvement, thanks for working on this!
>>>
>>> A few minor comments thus far:
>>> - in stubGenerator_ppc.cpp:
>>>   you seem to have lost a `const` in the refactoring
>>
>> Fixed.
>>
>>> - in psCardTable.hpp:
>>>   I don't think card_mark_must_follow_store() is needed, since
>>>   PSCardTable passes `false` for `conc_scan` to the CardTable
>>>   constructor
>>
>> Fixed. I took the liberty of also making the condition for 
>> card_mark_must_follow_store() more precise on CMS by making the 
>> condition for scanned_concurrently consider whether 
>> CMSPrecleaningEnabled is set or not (like other generated code does).
>>
>>> - in g1CollectedHeap.hpp:
>>>   could you store the G1CardTable as a field in G1CollectedHeap? Also,
>>>   could you name the "getter" just card_table()? (I see that
>>>   g1_hot_card_cache method above, but that one should also be 
>>> renamed to
>>>   just hot_card_cache, but in another patch)
>>
>> Fixed.
>>
>>> - in cardTable.hpp and cardTable.cpp:
>>>   could you use `hg cp` when constructing these files from
>>>   cardTableModRefBS.{hpp,cpp} so the history is preserved?
>>
>> Yes, I will do this before pushing to make sure the history is 
>> preserved.
>>
>> Thanks,
>> /Erik
>>
>>>
>>> Thanks,
>>> Erik
>>>
>>> On 02/15/2018 10:31 AM, Erik Österlund wrote:
>>>> Hi,
>>>>
>>>> Here is an updated revision of this webrev after internal feedback 
>>>> from StefanK who helped looking through my changes - thanks a lot 
>>>> for the help with that.
>>>>
>>>> The changes to the new revision are a bunch of minor clean up 
>>>> changes, e.g. copy right headers, indentation issues, sorting 
>>>> includes, adding/removing newlines, reverting an assert error 
>>>> message, fixing constructor initialization orders, and things like 
>>>> that.
>>>>
>>>> The problem I mentioned last time about the version number of our 
>>>> repo not yet being bumped to 11 and resulting awkwardness in JVMCI 
>>>> has been resolved by simply waiting. So now I changed the JVMCI 
>>>> logic to get the card values from the new location in the 
>>>> corresponding card tables when observing JDK version 11 or above.
>>>>
>>>> New full webrev (rebased onto a month fresher jdk-hs):
>>>> http://cr.openjdk.java.net/~eosterlund/8195142/webrev.01/
>>>>
>>>> Incremental webrev (over the rebase):
>>>> http://cr.openjdk.java.net/~eosterlund/8195142/webrev.00_01/
>>>>
>>>> This new version has run through hs-tier1-5 and jdk-tier1-3 without 
>>>> any issues.
>>>>
>>>> Thanks,
>>>> /Erik
>>>>
>>>> On 2018-01-17 13:54, Erik Österlund wrote:
>>>>> Hi,
>>>>>
>>>>> Today, both Parallel, CMS and Serial share the same code for its 
>>>>> card marking barrier. However, they have different requirements 
>>>>> how to manage its card tables by the GC. And as the card table 
>>>>> itself is embedded as a part of the CardTableModRefBS barrier set, 
>>>>> this has led to an unnecessary inheritance hierarchy for 
>>>>> CardTableModRefBS, where for example CardTableModRefBSForCTRS and 
>>>>> CardTableExtension are CardTableModRefBS subclasses that do not 
>>>>> change anything to do with the barriers.
>>>>>
>>>>> To clean up the code, there should really be a separate CardTable 
>>>>> hierarchy that contains the differences how to manage the card 
>>>>> table from the GC point of view, and simply let CardTableModRefBS 
>>>>> have a CardTable. This would allow removing 
>>>>> CardTableModRefBSForCTRS and CardTableExtension and their 
>>>>> references from shared code (that really have nothing to do with 
>>>>> the barriers, despite being barrier sets), and significantly 
>>>>> simplify the barrier set code.
>>>>>
>>>>> This patch mechanically performs this refactoring. A new CardTable 
>>>>> class has been created with a PSCardTable subclass for Parallel, a 
>>>>> CardTableRS for CMS and Serial, and a G1CardTable for G1. All 
>>>>> references to card tables and their values have been updated 
>>>>> accordingly.
>>>>>
>>>>> This touches a lot of platform specific code, so would be 
>>>>> fantastic if port maintainers could have a look that I have not 
>>>>> broken anything.
>>>>>
>>>>> There is a slight problem that should be pointed out. There is an 
>>>>> unfortunate interaction between Graal and hotspot. Graal needs to 
>>>>> know the values of g1 young cards and dirty cards. This is queried 
>>>>> in different ways in different versions of the JDK in the 
>>>>> ||GraalHotSpotVMConfig.java file. Now these values will move from 
>>>>> their barrier set class to their card table class. That means we 
>>>>> have at least three cases how to find the correct values. There is 
>>>>> one for JDK8, one for JDK9, and now a new one for JDK11. Except, 
>>>>> we have not yet bumped the version number to 11 in the repo, and 
>>>>> therefore it has to be from JDK10 - 11 for now and updated after 
>>>>> incrementing the version number. But that means that it will be 
>>>>> temporarily incompatible with JDK10. That is okay for our own copy 
>>>>> of Graal, but can not be used by upstream Graal as they are given 
>>>>> the choice whether to support the public JDK10 or the JDK11 that 
>>>>> does not quite admit to being 11 yet. I chose the solution that 
>>>>> works in our repository. I will notify Graal folks of this issue. 
>>>>> In the long run, it would be nice if we could have a more solid 
>>>>> interface here.
>>>>>
>>>>> However, as an added benefit, this changeset brings about a 
>>>>> hundred copyright headers up to date, so others do not have to 
>>>>> update them for a while.
>>>>>
>>>>> Bug:
>>>>> https://bugs.openjdk.java.net/browse/JDK-8195142
>>>>>
>>>>> Webrev:
>>>>> http://cr.openjdk.java.net/~eosterlund/8195142/webrev.00/
>>>>>
>>>>> Testing: mach5 hs-tier1-5 plus local AoT testing.
>>>>>
>>>>> Thanks,
>>>>> /Erik
>>>>
>>



More information about the hotspot-dev mailing list