RFR(s): 8152182: Possible overflow in initialzation of _rescan_task_size and _marking_task_size
sangheon
sangheon.kim at oracle.com
Thu Apr 7 04:29:20 UTC 2016
Hi Jon,
Thank you for the review.
On 04/05/2016 05:02 PM, Jon Masamitsu wrote:
> Sangheon,
>
> It occurs to me that if you created a function in CMS code
> check_rescan_task_size_alignment()
> to do the check
>
>> 506 const size_t rescan_task_size = cms->cmsSpace()->rescan_task_size();
>> 507 const size_t alignment = CardTableModRefBS::card_size * BitsPerWord;
>> 508
>> 509 if ((size_t)round_to((intptr_t)rescan_task_size, alignment) !=
>> rescan_task_size) {
>
> then you won't have to expose the particular alignment requirements in
> the
> constraint function. The code could look more like
>
> if ( check_rescan_task_size_alignment() ) {
>
> 513 CommandLineError::print(verbose,
> 514 "Rescan task size (" SIZE_FORMAT " = CMSRescanMultiple * "
> 515 "CardTableModRefBS::card_size_in_words * BitsPerWord) must be "
> 516 "aligned to CardTableModRefBS::card_size * BitsPerWord ("
> SIZE_FORMAT "). "
> 517 "Round-down value for CMSRescanMultiple is " SIZE_FORMAT "\n",
> 518 rescan_task_size, alignment, round_down_value);
> 519 status = Flag::VIOLATES_CONSTRAINT;
>
> }
>
>
> You might be able to do something similar in the other constraint
> function.
Your suggestion especially not exposing the alignment inspired me to
make it simpler. :)
Task size is 'flag *CardTableModRefBS::card_size_in_words * BitsPerWord'
and we have to check the alignment with CardTableModRefBS::card_size *
BitsPerWord. As CardTableModRefBS::card_size_in_words =
CardTableModRefBS::card_size / sizeof(HeapWord), if these flags are a
multiple of sizeof(HeapWord), the task size will be aligned.
>
> Also for
>
> 472 if (value > addr_ergo_max) {
> 473 CommandLineError::print(verbose,
> 474 "%s (" SIZE_FORMAT ") must be "
> 475 "less than or equal to ergonomic maximum (" SIZE_FORMAT ") "
> 476 "based on start address corresponds to the old generation of the
> Java heap\n",
> 477 name, value, addr_ergo_max);
> 478 return Flag::VIOLATES_CONSTRAINT;
> 479 }
>
> Printing the addr_ergo_max might be confusing to the users since it
> will be a very large
> number. Not sure what to do unless you can print a maximum value of
> the flag based
> on the maximum heap size (instead of based on MAX_SIZE).
I agree that using max heap will be better, so I fixed.
Considering your comment above (not exposing alignment information as it
is not nice), I had to add a new method to get ergonomic maximum values
for these task sizes. We can check their constraint without this
function, but can't print out ergo max. Or have to use
CardTableModRefBS::card_size_in_words * BitsPerWord on its calculation.
Webrev:
http://cr.openjdk.java.net/~sangheki/8152182/webrev.02
http://cr.openjdk.java.net/~sangheki/8152182/webrev.02_to_01
Testing: JPRT, runtime/commandline JTREG on all platforms.
Thanks,
Sangheon
>
> Ask if that's not clear.
>
> Jon
>
>
>
> On 4/5/2016 10:24 AM, sangheon wrote:
>> Hi all,
>>
>> Please review this change for CMSRescanMultiple and
>> CMSConcMarkMultiple flags.
>>
>> Both flags are set by "CardTableModRefBS::card_size_in_words *
>> BitsPerWord * flag" which potentially would make an overflow with
>> their maximum value without setting range. And these flags also would
>> make an arithmetic overflow when calculating with the size and the
>> start address of reserved area. In addition, CMSRescanMultiple needs
>> an alignment check.
>>
>> CR: https://bugs.openjdk.java.net/browse/JDK-8152182
>> Webrev: http://cr.openjdk.java.net/~sangheki/8152182/webrev.00
>> Testing: JPRT, runtime/commandline JTREG for all platforms
>>
>> Thanks,
>> Sangheon
>
More information about the hotspot-gc-dev
mailing list