RFR: 8244752: Enable Linux support for multiple huge page sizes -XX:LargePageSizeInBytes
Kim Barrett
kim.barrett at oracle.com
Tue May 12 11:39:12 UTC 2020
> 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