8206316: ZGC: Preferred tmpfs mount point not found on Debian
Reviewed-by: kbarrett, tschatzl, ehelin
--- 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;