diff options
author | David Carlier <devnexen@gmail.com> | 2022-01-25 17:31:32 +0000 |
---|---|---|
committer | dormando <dormando@rydia.net> | 2022-01-25 15:01:34 -0800 |
commit | a7aafbbfe34ce2c0b564108a6b0d7a118be968e5 (patch) | |
tree | 8f88aa24e44f2253f9b42abfb54fff036fae55a1 /memcached.c | |
parent | 5ae69e9d3c38b38288c2705f17ec980aa4130e41 (diff) | |
download | memcached-a7aafbbfe34ce2c0b564108a6b0d7a118be968e5.tar.gz |
core: fix large pages detection on redhat distros
Diffstat (limited to 'memcached.c')
-rw-r--r-- | memcached.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/memcached.c b/memcached.c index a6e187c..dd1b8ed 100644 --- a/memcached.c +++ b/memcached.c @@ -4246,13 +4246,38 @@ static int enable_large_pages(void) { return ret; #elif defined(__linux__) && defined(MADV_HUGEPAGE) /* check if transparent hugepages is compiled into the kernel */ - struct stat st; - int ret = stat("/sys/kernel/mm/transparent_hugepage/enabled", &st); - if (ret || !(st.st_mode & S_IFREG)) { + /* RH based systems possibly uses a different path */ + static const char *mm_thp_paths[] = { + "/sys/kernel/mm/transparent_hugepage/enabled", + "/sys/kernel/mm/redhat_transparent_hugepage/enabled", + NULL + }; + + char thpb[128] = {0}; + int pfd = -1; + for (const char **p = mm_thp_paths; *p; p++) { + if ((pfd = open(*p, O_RDONLY)) != -1) + break; + } + + if (pfd == -1) { fprintf(stderr, "Transparent huge pages support not detected.\n"); fprintf(stderr, "Will use default page size.\n"); return -1; } + ssize_t rd = read(pfd, thpb, sizeof(thpb)); + close(pfd); + if (rd <= 0) { + fprintf(stderr, "Transparent huge pages could not read the configuration.\n"); + fprintf(stderr, "Will use default page size.\n"); + return -1; + } + thpb[rd] = 0; + if (strstr(thpb, "[never]")) { + fprintf(stderr, "Transparent huge pages support disabled.\n"); + fprintf(stderr, "Will use default page size.\n"); + return -1; + } return 0; #elif defined(__FreeBSD__) int spages; |