RFR(XXS): 8029091: Bug in calculation of code cache sweeping interval
Albert Noll
albert.noll at oracle.com
Mon Nov 25 12:20:26 PST 2013
Thanks for the review Vladimir.
Best,
Albert
Von meinem iPhone gesendet
> Am 25.11.2013 um 20:53 schrieb Vladimir Kozlov <vladimir.kozlov at oracle.com>:
>
>> On 11/25/13 11:27 AM, Albert Noll wrote:
>> Hi Vladimir,
>>
>> Thanks for looking at this. The current patch casts the unsigned value (ReservedCodeCacheSize) to a signed value. That should be fine, since the result will always be small enough to fit into an int.
>
> Yes, it is true.
>
>>
>> This seems clearer to me than depending on ordering and implicit type casts.
>
> Okay.
>
> Thanks,
> Vladimir
>
>>
>> Best,
>> Albert
>>
>> Von meinem iPhone gesendet
>>
>>> Am 25.11.2013 um 18:58 schrieb Vladimir Kozlov <vladimir.kozlov at oracle.com>:
>>>
>>> Sorry, it is Monday morning.
>>>
>>> CodeCache::reverse_free_ratio() returns double. Then why calculation is not done in doubles in original code?
>>> Can you just swap time_since_last_sweep and CodeCache::reverse_free_ratio() if it is order dependent?
>>>
>>> Thanks,
>>> Vladimir
>>>
>>>> On 11/25/13 9:47 AM, Vladimir Kozlov wrote:
>>>> On other hand ReservedCodeCacheSize can't be big since there is 2Gb limit. So it is small int value.
>>>> That in mind the fix is good.
>>>>
>>>> Thanks,
>>>> Vladimir
>>>>
>>>>> On 11/25/13 9:33 AM, Vladimir Kozlov wrote:
>>>>> Albert,
>>>>>
>>>>> What if you use double type for calculations?:
>>>>>
>>>>> + const double max_wait_time = (double)ReservedCodeCacheSize / (16 * M);
>>>>>
>>>>> Thanks,
>>>>> Vladimir
>>>>>
>>>>>> On 11/25/13 5:27 AM, Albert Noll wrote:
>>>>>> Hi all,
>>>>>>
>>>>>> could I have reviews for this small patch?
>>>>>>
>>>>>> Bug: _
>>>>>> _https://bugs.openjdk.java.net/browse/JDK-8029091
>>>>>>
>>>>>> Webrev:
>>>>>> http://cr.openjdk.java.net/~anoll/8029091/webrev.00/
>>>>>>
>>>>>> Problem:
>>>>>> The calculation of 'wait_until_next_sweep' in 'NMethodSweeper::possibly_sweep() {}' has a signed
>>>>>> to unsigned conversion bug. The calculation is currently done as follows:
>>>>>>
>>>>>> double wait_until_next_sweep = (ReservedCodeCacheSize / (16 * M)) - time_since_last_sweep -
>>>>>> CodeCache::reverse_free_ratio();
>>>>>>
>>>>>> Since the type of 'ReservedCodeCacheSize' (uintx) has a higher rank than 'time_since_last_sleep' (int) and
>>>>>> 'time_since_last_sweep' can be larger than ' (ReservedCodeCacheSize / (16 * M))' there is an underflow. Consequently,
>>>>>> 'wait_until_next_sweep' is assigned a wrong value, which disables the intended periodic code cache sweeps.
>>>>>>
>>>>>> Solution:
>>>>>> Use only signed types for the calculation of 'wait_until_next_sweep'. Furthermore, an assert checks that
>>>>>> 'wait_until_next_sweep' is never larger than ' (ReservedCodeCacheSize / (16 * M))', which is the
>>>>>> maximum time between two sweeps.
>>>>>>
>>>>>>
>>>>>> Many thanks in advance,
>>>>>> Albert
More information about the hotspot-compiler-dev
mailing list