8206316: ZGC: Preferred tmpfs mount point not found on Debian
authorpliden
Wed, 04 Jul 2018 12:04:02 +0200
changeset 50980 343d3c0dd368
parent 50979 270b11dadbaf
child 50981 ce27f6e0734d
8206316: ZGC: Preferred tmpfs mount point not found on Debian Reviewed-by: kbarrett, tschatzl, ehelin
src/hotspot/os_cpu/linux_x86/gc/z/zBackingFile_linux_x86.cpp
src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp
src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.hpp
--- a/src/hotspot/os_cpu/linux_x86/gc/z/zBackingFile_linux_x86.cpp	Wed Jul 04 12:04:02 2018 +0200
+++ b/src/hotspot/os_cpu/linux_x86/gc/z/zBackingFile_linux_x86.cpp	Wed Jul 04 12:04:02 2018 +0200
@@ -46,10 +46,6 @@
 // Sysfs file for transparent huge page on tmpfs
 #define ZFILENAME_SHMEM_ENABLED          "/sys/kernel/mm/transparent_hugepage/shmem_enabled"
 
-// Default mount points
-#define ZMOUNTPOINT_TMPFS                "/dev/shm"
-#define ZMOUNTPOINT_HUGETLBFS            "/hugepages"
-
 // Java heap filename
 #define ZFILENAME_HEAP                   "java_heap"
 
@@ -78,6 +74,20 @@
 #define HUGETLBFS_MAGIC                  0x958458f6
 #endif
 
+// Preferred tmpfs mount points, ordered by priority
+static const char* z_preferred_tmpfs_mountpoints[] = {
+  "/dev/shm",
+  "/run/shm",
+  NULL
+};
+
+// Preferred hugetlbfs mount points, ordered by priority
+static const char* z_preferred_hugetlbfs_mountpoints[] = {
+  "/dev/hugepages",
+  "/hugepages",
+  NULL
+};
+
 static int z_memfd_create(const char *name, unsigned int flags) {
   return syscall(__NR_memfd_create, name, flags);
 }
@@ -165,11 +175,15 @@
 }
 
 int ZBackingFile::create_file_fd(const char* name) const {
-  const char* const filesystem = ZLargePages::is_explicit() ? ZFILESYSTEM_HUGETLBFS : ZFILESYSTEM_TMPFS;
-  const char* const mountpoint = ZLargePages::is_explicit() ? ZMOUNTPOINT_HUGETLBFS : ZMOUNTPOINT_TMPFS;
+  const char* const filesystem = ZLargePages::is_explicit()
+                                 ? ZFILESYSTEM_HUGETLBFS
+                                 : ZFILESYSTEM_TMPFS;
+  const char** const preferred_mountpoints = ZLargePages::is_explicit()
+                                             ? z_preferred_hugetlbfs_mountpoints
+                                             : z_preferred_tmpfs_mountpoints;
 
   // Find mountpoint
-  ZBackingPath path(filesystem, mountpoint);
+  ZBackingPath path(filesystem, preferred_mountpoints);
   if (path.get() == NULL) {
     log_error(gc, init)("Use -XX:ZPath to specify the path to a %s filesystem", filesystem);
     return -1;
--- a/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp	Wed Jul 04 12:04:02 2018 +0200
+++ b/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp	Wed Jul 04 12:04:02 2018 +0200
@@ -33,13 +33,13 @@
 // Mount information, see proc(5) for more details.
 #define PROC_SELF_MOUNTINFO        "/proc/self/mountinfo"
 
-ZBackingPath::ZBackingPath(const char* filesystem, const char* preferred_path) {
+ZBackingPath::ZBackingPath(const char* filesystem, const char** preferred_mountpoints) {
   if (ZPath != NULL) {
     // Use specified path
     _path = strdup(ZPath);
   } else {
     // Find suitable path
-    _path = find_mountpoint(filesystem, preferred_path);
+    _path = find_mountpoint(filesystem, preferred_mountpoints);
   }
 }
 
@@ -52,8 +52,8 @@
   char* line_mountpoint = NULL;
   char* line_filesystem = NULL;
 
-  // Parse line and return a newly allocated string containing the mountpoint if
-  // the line contains a matching filesystem and the mountpoint is accessible by
+  // Parse line and return a newly allocated string containing the mount point if
+  // the line contains a matching filesystem and the mount point is accessible by
   // the current user.
   if (sscanf(line, "%*u %*u %*u:%*u %*s %ms %*[^-]- %ms", &line_mountpoint, &line_filesystem) != 2 ||
       strcmp(line_filesystem, filesystem) != 0 ||
@@ -68,7 +68,7 @@
   return line_mountpoint;
 }
 
-void ZBackingPath::get_mountpoints(ZArray<char*>* mountpoints, const char* filesystem) const {
+void ZBackingPath::get_mountpoints(const char* filesystem, ZArray<char*>* mountpoints) const {
   FILE* fd = fopen(PROC_SELF_MOUNTINFO, "r");
   if (fd == NULL) {
     ZErrno err;
@@ -98,37 +98,45 @@
   mountpoints->clear();
 }
 
-char* ZBackingPath::find_mountpoint(const char* filesystem, const char* preferred_mountpoint) const {
+char* ZBackingPath::find_preferred_mountpoint(const char* filesystem,
+                                              ZArray<char*>* mountpoints,
+                                              const char** preferred_mountpoints) const {
+  // Find preferred mount point
+  ZArrayIterator<char*> iter1(mountpoints);
+  for (char* mountpoint; iter1.next(&mountpoint);) {
+    for (const char** preferred = preferred_mountpoints; *preferred != NULL; preferred++) {
+      if (!strcmp(mountpoint, *preferred)) {
+        // Preferred mount point found
+        return strdup(mountpoint);
+      }
+    }
+  }
+
+  // Preferred mount point not found
+  log_error(gc, init)("More than one %s filesystem found:", filesystem);
+  ZArrayIterator<char*> iter2(mountpoints);
+  for (char* mountpoint; iter2.next(&mountpoint);) {
+    log_error(gc, init)("  %s", mountpoint);
+  }
+
+  return NULL;
+}
+
+char* ZBackingPath::find_mountpoint(const char* filesystem, const char** preferred_mountpoints) const {
   char* path = NULL;
   ZArray<char*> mountpoints;
 
-  get_mountpoints(&mountpoints, filesystem);
+  get_mountpoints(filesystem, &mountpoints);
 
   if (mountpoints.size() == 0) {
-    // No filesystem found
+    // No mount point found
     log_error(gc, init)("Failed to find an accessible %s filesystem", filesystem);
   } else if (mountpoints.size() == 1) {
-    // One filesystem found
+    // One mount point found
     path = strdup(mountpoints.at(0));
-  } else if (mountpoints.size() > 1) {
-    // More than one filesystem found
-    ZArrayIterator<char*> iter(&mountpoints);
-    for (char* mountpoint; iter.next(&mountpoint);) {
-      if (!strcmp(mountpoint, preferred_mountpoint)) {
-        // Preferred mount point found
-        path = strdup(mountpoint);
-        break;
-      }
-    }
-
-    if (path == NULL) {
-      // Preferred mount point not found
-      log_error(gc, init)("More than one %s filesystem found:", filesystem);
-      ZArrayIterator<char*> iter2(&mountpoints);
-      for (char* mountpoint; iter2.next(&mountpoint);) {
-        log_error(gc, init)("  %s", mountpoint);
-      }
-    }
+  } else {
+    // More than one mount point found
+    path = find_preferred_mountpoint(filesystem, &mountpoints, preferred_mountpoints);
   }
 
   free_mountpoints(&mountpoints);
--- a/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.hpp	Wed Jul 04 12:04:02 2018 +0200
+++ b/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.hpp	Wed Jul 04 12:04:02 2018 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,13 +31,19 @@
 private:
   char* _path;
 
-  char* get_mountpoint(const char* line, const char* filesystem) const;
-  void get_mountpoints(ZArray<char*>* mountpoints, const char* filesystem) const;
+  char* get_mountpoint(const char* line,
+                       const char* filesystem) const;
+  void get_mountpoints(const char* filesystem,
+                       ZArray<char*>* mountpoints) const;
   void free_mountpoints(ZArray<char*>* mountpoints) const;
-  char* find_mountpoint(const char* filesystem, const char* preferred_mountpoint) const;
+  char* find_preferred_mountpoint(const char* filesystem,
+                                  ZArray<char*>* mountpoints,
+                                  const char** preferred_mountpoints) const;
+  char* find_mountpoint(const char* filesystem,
+                        const char** preferred_mountpoints) const;
 
 public:
-  ZBackingPath(const char* filesystem, const char* preferred_path);
+  ZBackingPath(const char* filesystem, const char** preferred_mountpoints);
   ~ZBackingPath();
 
   const char* get() const;