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