RFR: 8324580: SIGFPE on THP initialization on kernels < 4.10 [v3]
Thomas Stuefe
stuefe at openjdk.org
Wed Jan 31 07:04:02 UTC 2024
On Tue, 30 Jan 2024 19:01:21 GMT, Zdenek Zambersky <zzambers at openjdk.org> wrote:
>> **Problem:**
>> When THP is enabled, JDK reads `/sys/kernel/mm/transparent_hugepage/hpage_pmd_size` file to [detect](https://github.com/openjdk/jdk/blob/96607df7f055a80d56ea4c19f3f4fcb32838b1f8/src/hotspot/os/linux/hugepages.cpp#L206) large page size. However this file only [appeared](https://github.com/torvalds/linux/commit/49920d28781dcced10cd30cb9a938e7d045a1c94) in kernel 4.10 and does not exist on kernel old kernels (such as 3.10 used by RHEL-7).
>>
>> This results in detected large page size of 0B and crash, when `-XX:+UseTransparentHugePages` is used on old kernel.
>>
>> gdb --args jdk-23+6/bin/java -XX:+UseTransparentHugePages -Xmx128m -Xlog:pagesize -version
>> ...
>> [0.005s][info][pagesize] Static hugepage support:
>> [0.005s][info][pagesize] hugepage size: 2M
>> [0.005s][info][pagesize] hugepage size: 1G
>> [0.005s][info][pagesize] default hugepage size: 2M
>> [0.005s][info][pagesize] Transparent hugepage (THP) support:
>> [0.005s][info][pagesize] THP mode: always
>> [0.005s][info][pagesize] THP pagesize: 0B
>> [0.005s][info][pagesize] Shared memory transparent hugepage (THP) support:
>> [0.005s][info][pagesize] Shared memory THP mode: unknown
>> [0.005s][info][pagesize] JVM will attempt to prevent THPs in thread stacks.
>> [0.005s][info][pagesize] UseLargePages=1, UseTransparentHugePages=1
>> [0.005s][info][pagesize] Large page support enabled. Usable page sizes: 4k. Default large page size: 0B.
>>
>> Program received signal SIGFPE, Arithmetic exception.
>> [Switching to Thread 0x7ffff7fc2700 (LWP 31385)]
>> 0x00007ffff68eeb20 in lcm(unsigned long, unsigned long) () from /home/tester/jdk-23+6/lib/server/libjvm.so
>> (gdb) bt
>> #0 0x00007ffff68eeb20 in lcm(unsigned long, unsigned long) () from /home/tester/jdk-23+6/lib/server/libjvm.so
>> #1 0x00007ffff64a68f2 in Arguments::apply_ergo() () from /home/tester/jdk-23+6/lib/server/libjvm.so
>> #2 0x00007ffff700458f in Threads::create_vm(JavaVMInitArgs*, bool*) () from /home/tester/jdk-23+6/lib/server/libjvm.so
>> #3 0x00007ffff6a2373f in JNI_CreateJavaVM () from /home/tester/jdk-23+6/lib/server/libjvm.so
>> #4 0x00007ffff7fe704b in InitializeJVM (ifn=<synthetic pointer>, penv=0x7ffff7fc1ea8, pvm=0x7ffff7fc1ea0) at src/java.base/share/native/libjli/java.c:1550
>> #5 JavaMain (_args=<optimized out>) at src/java.base/share/native/libjli/java.c:491
>> #6 0x00007ffff7feb1c9 in ThreadJavaMain (args=<optimized out>) at src/java.base/unix/native/libjli/java_md.c:650
>> #7 0x00007ffff7bc6ea5 in start_thread (arg...
>
> Zdenek Zambersky has updated the pull request incrementally with one additional commit since the last revision:
>
> Fixed whitespace error
src/hotspot/os/linux/os_linux.cpp line 3879:
> 3877: _large_page_size = HugePages::thp_pagesize();
> 3878: if (_large_page_size == 0) {
> 3879: // Unknown THP page size => falback to default static hugepage size
Typo falback
src/hotspot/os/linux/os_linux.cpp line 3885:
> 3883: return;
> 3884: }
> 3885: _large_page_size = MIN2(HugePages::default_static_hugepage_size(), 16 * M);
The more I think about this, the more I doubt my own advice. What I wrote before is still true, but it may confuse users to see a page size of 16MB pop up in log files and somesuch, e.g. on intel systems.
Could you please modify this code like this:
if (_large_page_size == 0) {
// Older kernels won't publish the THP page size. Fall back to default static huge page size,
// since that is likely to be the THP page size as well. Don't do it if the page size is considered
// too large to avoid large alignment waste.
log_info(pagesize) ("Cannot determine THP page size (kernel < 4.0 ?)");
if (HugePages::supports_static_hugepages() &&
HugePages::default_static_hugepage_size() <= 16 * M) {
_large_page_size = HugePages::default_static_hugepage_size();
} else {
warn_no_large_pages_configured();
UseLargePages = UseTransparentHugePages = false;
return;
}
}
and then mirror this logic in the test please.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/17545#discussion_r1472369516
PR Review Comment: https://git.openjdk.org/jdk/pull/17545#discussion_r1472375666
More information about the hotspot-runtime-dev
mailing list