--- old/src/hotspot/os_cpu/linux_x86/gc/z/zBackingFile_linux_x86.cpp 2018-07-03 22:08:42.569261404 +0200 +++ new/src/hotspot/os_cpu/linux_x86/gc/z/zBackingFile_linux_x86.cpp 2018-07-03 22:08:42.370252712 +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 tmpfs 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); } @@ -166,10 +176,10 @@ 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 mountpoints = ZLargePages::is_explicit() ? z_preferred_hugetlbfs_mountpoints : z_preferred_tmpfs_mountpoints; // Find mountpoint - ZBackingPath path(filesystem, mountpoint); + ZBackingPath path(filesystem, mountpoints); if (path.get() == NULL) { log_error(gc, init)("Use -XX:ZPath to specify the path to a %s filesystem", filesystem); return -1; --- old/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp 2018-07-03 22:08:43.294293071 +0200 +++ new/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp 2018-07-03 22:08:43.088284073 +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); } } @@ -68,7 +68,7 @@ return line_mountpoint; } -void ZBackingPath::get_mountpoints(ZArray* mountpoints, const char* filesystem) const { +void ZBackingPath::get_mountpoints(const char* filesystem, ZArray* 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* mountpoints, + const char** preferred_mountpoints) const { + // Among the found mountpoints, return the first that is on the list of preferred mountpoints + ZArrayIterator iter1(mountpoints); + for (char* mountpoint; iter1.next(&mountpoint);) { + for (const char** preferred = preferred_mountpoints; *preferred != NULL; preferred++) { + if (!strcmp(mountpoint, *preferred)) { + // Preferred mountpoint found + return strdup(mountpoint); + } + } + } + + // Preferred mountpoint not found + log_error(gc, init)("More than one %s filesystem found:", filesystem); + ZArrayIterator 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 mountpoints; - get_mountpoints(&mountpoints, filesystem); + get_mountpoints(filesystem, &mountpoints); if (mountpoints.size() == 0) { - // No filesystem found + // No mountpoint found log_error(gc, init)("Failed to find an accessible %s filesystem", filesystem); } else if (mountpoints.size() == 1) { - // One filesystem found + // One mountpoint found path = strdup(mountpoints.at(0)); - } else if (mountpoints.size() > 1) { - // More than one filesystem found - ZArrayIterator 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 iter2(&mountpoints); - for (char* mountpoint; iter2.next(&mountpoint);) { - log_error(gc, init)(" %s", mountpoint); - } - } + } else { + // More than one mountpoint found + path = find_preferred_mountpoint(filesystem, &mountpoints, preferred_mountpoints); } free_mountpoints(&mountpoints); --- old/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.hpp 2018-07-03 22:08:43.602306524 +0200 +++ new/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.hpp 2018-07-03 22:08:43.398297614 +0200 @@ -31,13 +31,19 @@ private: char* _path; - char* get_mountpoint(const char* line, const char* filesystem) const; - void get_mountpoints(ZArray* mountpoints, const char* filesystem) const; + char* get_mountpoint(const char* line, + const char* filesystem) const; + void get_mountpoints(const char* filesystem, + ZArray* mountpoints) const; void free_mountpoints(ZArray* mountpoints) const; - char* find_mountpoint(const char* filesystem, const char* preferred_mountpoint) const; + char* find_preferred_mountpoint(const char* filesystem, + ZArray* 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;