RFR: 8244752: Enable Linux support for multiple huge page sizes -XX:LargePageSizeInBytes
stefan.johansson at oracle.com
stefan.johansson at oracle.com
Thu May 14 08:48:53 UTC 2020
Hi Ivan,
On 2020-05-13 15:56, Ivan Walulya wrote:
> Thanks Kim,
>
> Suggested modifications have been made in a new webrev:
>
> https://cr.openjdk.java.net/~iwalulya/8244752/01/
Looks good. We could file a new RFE to investigate if it would make
sense to support fallback to the default large-page size if we fail the
mapping with the given size.
Thanks,
Stefan
>
> //Ivan
>
>> On 12 May 2020, at 13:39, Kim Barrett <kim.barrett at oracle.com> wrote:
>>
>>> On May 11, 2020, at 12:46 PM, Ivan Walulya <ivan.walulya at oracle.com> wrote:
>>>
>>> Hi all,
>>>
>>> Please review this enhancement to enable selecting a desired huge page size on Linux systems that support multiple huge page sizes.
>>>
>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8244752
>>> Webrev: http://cr.openjdk.java.net/~iwalulya/8244752/00/
>>> Testing: Tier 1 - 3
>>>
>>>
>>> //Ivan
>>
>> ------------------------------------------------------------------------------
>> src/hotspot/os/linux/os_linux.cpp
>> 3819 sscanf(entry->d_name, "hugepages-%zukB", &page_size) ) {
>>
>> Implicit boolean.
>>
>> ------------------------------------------------------------------------------
>> src/hotspot/os/linux/os_linux.cpp
>> 3845 if (!FLAG_IS_DEFAULT(LargePageSizeInBytes) && LargePageSizeInBytes != _large_page_size ) {
>> 3846 if (is_valid_large_page_size(LargePageSizeInBytes)) {
>>
>> Inner if appears to be indented 3 spaces rather than the usual 2.
>>
>> ------------------------------------------------------------------------------
>> src/hotspot/os/linux/os_linux.cpp
>> 3799 void os::Linux::find_large_page_sizes() {
>>
>> I think that's not a great name for what this function is doing, which
>> is collecting large page sizes in _page_sizes[]. However, I think
>> there are other problems here.
>>
>> The collection of sizes into _page_sizes[] doesn't conform to the
>> description of _page_sizes[], which says the array is sorted in
>> decreasing order. Here it's whatever order the directory iteration
>> happens upon them.
>>
>> I think that the pre-existing code at the end of setup_large_page_size
>> will fix it up on any reasonable configuration, but I'm not certain of
>> that and I'm not certain all systems are configured reasonably.
>>
>> find_large_page_sizes is only called from is_valid_large_page_size,
>> which is only called by setup_large_page_size. It seems like it would
>> be more straightforward to hoist the iteration over /sys/kernel/mm/hugepages
>> into is_valid_large_page_size and not touch _page_sizes at all there.
>>
>> ------------------------------------------------------------------------------
>> src/hotspot/os/linux/os_linux.cpp
>> 4097 flags |= (os::large_page_size() > (1 << (MAP_HUGE_2MB >> MAP_HUGE_SHIFT)))
>> 4098 ? MAP_HUGE_1GB
>> 4099 : MAP_HUGE_2MB;
>>
>> Shouldn't this just be:
>>
>> flags |= (os::large_page_size() > (2 * M)) ? MAP_HUGE_1G : MAP_HUGE_2MB;
>>
>> (Though there's also Thomas's comments to account for.)
>>
>> There's no particular reason here to think the encoding used for
>> MAP_HUGE_2MB has any direct relation to a size in bytes.
>>
>> Similarly here:
>> 4173 flags |= (os::large_page_size() > (1 << (MAP_HUGE_2MB >> MAP_HUGE_SHIFT)))
>> 4174 ? MAP_HUGE_1GB
>> 4175 : MAP_HUGE_2MB;
>>
>> ------------------------------------------------------------------------------
>> src/hotspot/os/linux/os_linux.cpp
>> 4096 if (!FLAG_IS_DEFAULT(LargePageSizeInBytes)) {
>>
>> Why is this checking for non-default value for the option? It seems
>> like this might do the wrong thing if an explicit command line option
>> was “rejected" because it had an unsupported value.
>>
>> Similarly here:
>> 4172 if (!FLAG_IS_DEFAULT(LargePageSizeInBytes)) {
>>
>> ------------------------------------------------------------------------------
>>
>
More information about the hotspot-gc-dev
mailing list