summaryrefslogtreecommitdiff
path: root/memcached.c
diff options
context:
space:
mode:
authorDavid Carlier <devnexen@gmail.com>2022-01-25 17:31:32 +0000
committerdormando <dormando@rydia.net>2022-01-25 15:01:34 -0800
commita7aafbbfe34ce2c0b564108a6b0d7a118be968e5 (patch)
tree8f88aa24e44f2253f9b42abfb54fff036fae55a1 /memcached.c
parent5ae69e9d3c38b38288c2705f17ec980aa4130e41 (diff)
downloadmemcached-a7aafbbfe34ce2c0b564108a6b0d7a118be968e5.tar.gz
core: fix large pages detection on redhat distros
Diffstat (limited to 'memcached.c')
-rw-r--r--memcached.c31
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;