Large page use crashes the JVM on some Linux systems
B. Blaser
bsrbnd at gmail.com
Sun Apr 22 21:18:50 UTC 2018
[ I've trouble subscribing to hotspot-dev, please forward if necessary. ]
Hi,
After a clean build, some hotspot tests related to large page use are
failing on my 64-bit Linux system, for example:
gc/g1/TestLargePageUseForAuxMemory.java
[...]
Or simply:
$ ./build/linux-x86_64-normal-server-release/images/jdk/bin/java
-XX:+UseLargePages -version
is crashing the JVM because the latter assumes that large pages are
always supported on Linux, which appears to be wrong.
I suggest to make sure that large pages are supported when parsing the
arguments, as below.
Does this look reasonable (tier1 looks better now)?
Thanks,
Bernard
diff -r 8c85a1855e10 src/hotspot/share/runtime/arguments.cpp
--- a/src/hotspot/share/runtime/arguments.cpp Fri Apr 13 11:14:49 2018 -0700
+++ b/src/hotspot/share/runtime/arguments.cpp Sun Apr 22 20:29:21 2018 +0200
@@ -60,6 +60,7 @@
#include "utilities/defaultStream.hpp"
#include "utilities/macros.hpp"
#include "utilities/stringUtils.hpp"
+#include "sys/mman.h"
#if INCLUDE_JVMCI
#include "jvmci/jvmciRuntime.hpp"
#endif
@@ -4107,6 +4108,18 @@
UNSUPPORTED_OPTION(UseLargePages);
#endif
+#ifdef LINUX
+ void *p = mmap(NULL, os::large_page_size(), PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE|MAP_HUGETLB,
+ -1, 0);
+ if (p != MAP_FAILED) {
+ munmap(p, os::large_page_size());
+ }
+ else {
+ UNSUPPORTED_OPTION(UseLargePages);
+ }
+#endif
+
ArgumentsExt::report_unsupported_options();
#ifndef PRODUCT
diff -r 8c85a1855e10
test/hotspot/jtreg/runtime/memory/LargePages/TestLargePagesFlags.java
--- a/test/hotspot/jtreg/runtime/memory/LargePages/TestLargePagesFlags.java
Fri Apr 13 11:14:49 2018 -0700
+++ b/test/hotspot/jtreg/runtime/memory/LargePages/TestLargePagesFlags.java
Sun Apr 22 20:29:21 2018 +0200
@@ -37,7 +37,7 @@
public class TestLargePagesFlags {
public static void main(String [] args) throws Exception {
- if (!Platform.isLinux()) {
+ if (!Platform.isLinux() || !canUse(UseLargePages(true))) {
System.out.println("Skipping. TestLargePagesFlags has only been
implemented for Linux.");
return;
}
More information about the amber-dev
mailing list