{"id":2231982,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2231982/?format=json","web_url":"http://patchwork.ozlabs.org/project/glibc/patch/c80956cb80f1071b8691c6b2f22fe09a6d64256d.1777667949.git.ashamil435@gmail.com/","project":{"id":41,"url":"http://patchwork.ozlabs.org/api/1.1/projects/41/?format=json","name":"GNU C Library","link_name":"glibc","list_id":"libc-alpha.sourceware.org","list_email":"libc-alpha@sourceware.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<c80956cb80f1071b8691c6b2f22fe09a6d64256d.1777667949.git.ashamil435@gmail.com>","date":"2026-05-01T20:59:25","name":"hugepages: cache THP mode and page size [BZ #34083]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"19cc49efe37320d2a8b1f7f5dc94f7718e7eb4eb","submitter":{"id":93241,"url":"http://patchwork.ozlabs.org/api/1.1/people/93241/?format=json","name":"Shamil Abdulaev","email":"ashamil435@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/glibc/patch/c80956cb80f1071b8691c6b2f22fe09a6d64256d.1777667949.git.ashamil435@gmail.com/mbox/","series":[{"id":502496,"url":"http://patchwork.ozlabs.org/api/1.1/series/502496/?format=json","web_url":"http://patchwork.ozlabs.org/project/glibc/list/?series=502496","date":"2026-05-01T20:59:25","name":"hugepages: cache THP mode and page size [BZ #34083]","version":1,"mbox":"http://patchwork.ozlabs.org/series/502496/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2231982/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2231982/checks/","tags":{},"headers":{"Return-Path":"<libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org>","X-Original-To":["incoming@patchwork.ozlabs.org","libc-alpha@sourceware.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","libc-alpha@sourceware.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=pDL23jJr;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=pDL23jJr","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=none smtp.remote-ip=2a00:1450:4864:20::232"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g6k2517l1z1yJ0\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 02 May 2026 06:59:56 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id F15FF4374214\n\tfor <incoming@patchwork.ozlabs.org>; Fri,  1 May 2026 20:59:53 +0000 (GMT)","from mail-lj1-x232.google.com (mail-lj1-x232.google.com\n [IPv6:2a00:1450:4864:20::232])\n by sourceware.org (Postfix) with ESMTPS id A49184374200\n for <libc-alpha@sourceware.org>; Fri,  1 May 2026 20:59:33 +0000 (GMT)","by mail-lj1-x232.google.com with SMTP id\n 38308e7fff4ca-38ea6a5a0b3so22807141fa.3\n for <libc-alpha@sourceware.org>; Fri, 01 May 2026 13:59:33 -0700 (PDT)","from oops-lab.cluster.local ([62.152.34.188])\n by smtp.gmail.com with ESMTPSA id\n 38308e7fff4ca-393610d6d2dsm10027731fa.17.2026.05.01.13.59.29\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 01 May 2026 13:59:30 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org F15FF4374214","OpenDKIM Filter v2.11.0 sourceware.org A49184374200"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org A49184374200","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org A49184374200","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777669173; cv=none;\n b=T+5TrDFcve5WxfD0DMlH4xSE9SrVaCN+ZvtCAPQ2XAXaxyBgDRE/0r3+kQEg8/octoi4aI00fcCjwHARYeYmUWLMRFuvYOOBA3xEbN4qDIrRlWXjeRpjw3hAzAXwm1UARhO3+lj2+03OP8nI6ETJ7wKrJUkJBbJGtbLrO5W6ne0=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777669173; c=relaxed/simple;\n bh=f9M2g8YqZJq6UcUpdwmuVscojp+96Pzhjkq7KtWZfmQ=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=DyI4SoVcsCsKlDzoQnYq6kP3MFHrPreUnxxV2URwab7KRzYh+5YPyCClXwTZ4OM8+SEGJrWWyOEVNWskzGFn8Wi+o9PZ3/Vtyp8nEZEo/ugk7VBLjjmctLqFxNkkdgL2GjGrw9a8x7+KUqhOog6wsajI1xP8NIcoYOYjWTonDDc=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1777669172; x=1778273972; darn=sourceware.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=bQWpTtnWerBdgkfUIneF0afBpzfDHmVCLJRJs9ZWVQ0=;\n b=pDL23jJrdrCAmsawCR3BnNrWDekjeiofEpqGkDEWDlTKBOJLmm5uT+bBjRn+UvX4xe\n Rt8fxz9eG5KyGHmjZoyV8UxB7LxOw/xIWXUbXmtSxcdZmugMFqDlDd/UTVlXb3pGFGxH\n lnqBy65fx0rgEiY2FBpo/ucWpKtlQwDmjonZIWiTeGae1J7PlPXfIaNF5/2o4cU3NBeZ\n QPtzS5dzFP4QuNnXMl/uLpRU1S01AdWbLAi0r5gLi92mxWrgOjAWQ/UN7yA4tMX8RqnN\n k/25WXghmaCfTLmZSWBlRqya+44a4S/ekMiqymlmFreJzX6/CFFqB+TiJXTTn/Jlsrks\n 6dJA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777669172; x=1778273972;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=bQWpTtnWerBdgkfUIneF0afBpzfDHmVCLJRJs9ZWVQ0=;\n b=mrx5zg9is6+5uMSY83KjosBKrKz+CdWcsstCCzqeAAUOgBjlqiNyHj/BtyRw6RH5mf\n hDzxctyNoit2kWdxPwSuhQu7eAuJgMlVjItFb2uD4zYkHvOkGQ/srovBPmevQmwURiNJ\n eTXYk9s4WshNXW+zjfOOeSmhLQ5t+jyni2s5ZDOwUZgM8L8BYQ9KM3FdDK0gdbHzUhkb\n zop0jJQQwqfl9l9b+z2Ui3EOzyV7j5jKcfOi3nMoXAv0XbnVmI6wb9sSTM3PQnM69psD\n R/NxZbPkOS5RmzCSdFreaRQwT30OXXL1vRObWbYcn+iQwE3NU9Fo9Q598qboEzTncEBi\n onCQ==","X-Gm-Message-State":"AOJu0YzbKfLxF+dsODhN7Sq73HW+JDu+tqQiRRm+YAYNlN8X0vb0vbp1\n FM5PtKKTtyZtLwR9qBZ//0Ops30ko5z0ZSbLjPp09txCY+vJXXggOyo6wcNmN0f5GOw=","X-Gm-Gg":"AeBDiesWNh0PyITjPtBaH77aAkBYt/4a08vohAeTbKXqpr1fcye8YhCMVOL9aFKz1S+\n SDRazzGoOwlnWEGSCWXrS8H2Nyj2qGxUUKNjvE0qF6IUw2jP7rLIGr/ra08jIKh6URKs86AGWgm\n VYkW8lzGTX+B7u21GTc8wavfgnGzY3OfxzlEJOgTK7zxX5KfTBGj8DaCBf7g634/uUSMHKaWlYx\n rQu44mIiJMvHF9uGWxaqPPMI2Zp9YK3rTS0HbDRfQhzjnpOBJ0wL+3PLcviVaHsHZeQ3DwuqKOA\n XBr39rP5qim2kRDXPswc/L0yhwEK1DCLB8KmYfrBTsks5PqORrT1suwCEjTTzDNIuDgIOmCJOzN\n lRmV121xq2hhDdHmq0cKsPNrWa2I0rEO6ReXoOrdnZ1FbvFGiGsbqy0QP90CufpwCDVjJUePD3O\n Z1pYIF86FK6ANCQw8oAtE+Xsj0K3GvfNNtkMZkBMNgnUO0y7rr4Y60/17c3SqrQCo7WQ46bz1mS\n 3Qoy6sSJO/EjirJ8BlQ95YAQsp2rs/UZr3JwRS6BGc=","X-Received":"by 2002:a2e:bc02:0:b0:38e:a842:52f1 with SMTP id\n 38308e7fff4ca-393784ad0b5mr1644461fa.11.1777669171754;\n Fri, 01 May 2026 13:59:31 -0700 (PDT)","From":"Shamil Abdulaev <ashamil435@gmail.com>","To":"libc-alpha@sourceware.org","Cc":"hjl.tools@gmail.com","Subject":"[PATCH] hugepages: cache THP mode and page size [BZ #34083]","Date":"Fri,  1 May 2026 23:59:25 +0300","Message-ID":"\n <c80956cb80f1071b8691c6b2f22fe09a6d64256d.1777667949.git.ashamil435@gmail.com>","X-Mailer":"git-send-email 2.54.0","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"libc-alpha@sourceware.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Libc-alpha mailing list <libc-alpha.sourceware.org>","List-Unsubscribe":"<https://sourceware.org/mailman/options/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe>","List-Archive":"<https://sourceware.org/pipermail/libc-alpha/>","List-Post":"<mailto:libc-alpha@sourceware.org>","List-Help":"<mailto:libc-alpha-request@sourceware.org?subject=help>","List-Subscribe":"<https://sourceware.org/mailman/listinfo/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=subscribe>","Errors-To":"libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org"},"content":"__get_thp_mode and __get_thp_size read /sys files and are used by\nboth the dynamic linker and malloc.  Cache their results in rtld_global\nso the expensive THP probes are performed once per process.\n\nTested on x86_64-linux-gnu.  No new test failures.\n\nSigned-off-by: Shamil Abdulaev <ashamil435@gmail.com>\n---\n elf/dl-support.c                    |  6 +++\n sysdeps/generic/hugepages.h         |  7 ++++\n sysdeps/generic/ldsodefs.h          |  6 +++\n sysdeps/unix/sysv/linux/hugepages.c | 58 ++++++++++++++++++++++++-----\n 4 files changed, 68 insertions(+), 9 deletions(-)","diff":"diff --git a/elf/dl-support.c b/elf/dl-support.c\nindex 0508d6113b..ec77cb3e7a 100644\n--- a/elf/dl-support.c\n+++ b/elf/dl-support.c\n@@ -144,6 +144,12 @@ int _dl_inhibit_cache;\n /* All known directories in sorted order.  */\n struct r_search_path_elem *_dl_all_dirs;\n \n+/* Cached Transparent Huge Page mode and page size.  */\n+int _dl_thp_mode;\n+unsigned long int _dl_thp_pagesize;\n+int _dl_thp_mode_state;\n+int _dl_thp_pagesize_state;\n+\n /* All directories after startup.  */\n struct r_search_path_elem *_dl_init_all_dirs;\n \ndiff --git a/sysdeps/generic/hugepages.h b/sysdeps/generic/hugepages.h\nindex 5fc9b5c8de..68be2ee242 100644\n--- a/sysdeps/generic/hugepages.h\n+++ b/sysdeps/generic/hugepages.h\n@@ -32,6 +32,13 @@ enum thp_mode_t\n   thp_mode_not_supported\n };\n \n+enum thp_cache_state_t\n+{\n+  thp_cache_uninitialized,\n+  thp_cache_initializing,\n+  thp_cache_initialized\n+};\n+\n enum thp_mode_t __get_thp_mode (void) attribute_hidden;\n \n /* Return the supported huge page size from the REQUESTED sizes on PAGESIZE\ndiff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h\nindex 15c4659853..4b2e337a81 100644\n--- a/sysdeps/generic/ldsodefs.h\n+++ b/sysdeps/generic/ldsodefs.h\n@@ -395,6 +395,12 @@ struct rtld_global\n   /* List of search directories.  */\n   EXTERN struct r_search_path_elem *_dl_all_dirs;\n \n+  /* Cached Transparent Huge Page mode and page size.  */\n+  EXTERN int _dl_thp_mode;\n+  EXTERN unsigned long int _dl_thp_pagesize;\n+  EXTERN int _dl_thp_mode_state;\n+  EXTERN int _dl_thp_pagesize_state;\n+\n   /* Get architecture specific definitions.  */\n #define PROCINFO_DECL\n #ifndef PROCINFO_CLASS\ndiff --git a/sysdeps/unix/sysv/linux/hugepages.c b/sysdeps/unix/sysv/linux/hugepages.c\nindex 46e05151a3..c32127f6a4 100644\n--- a/sysdeps/unix/sysv/linux/hugepages.c\n+++ b/sysdeps/unix/sysv/linux/hugepages.c\n@@ -16,6 +16,8 @@\n    License along with the GNU C Library; see the file COPYING.LIB.  If\n    not, see <https://www.gnu.org/licenses/>.  */\n \n+#include <atomic.h>\n+#include <ldsodefs.h>\n #include <intprops.h>\n #include <dirent.h>\n #include <hugepages.h>\n@@ -25,18 +27,32 @@\n unsigned long int\n __get_thp_size (void)\n {\n+  if (atomic_load_acquire (&GL (dl_thp_pagesize_state))\n+      == thp_cache_initialized)\n+    return GL (dl_thp_pagesize);\n+\n+  int state = thp_cache_uninitialized;\n+  if (!atomic_compare_exchange_acquire (&GL (dl_thp_pagesize_state),\n+\t\t\t\t\t&state, thp_cache_initializing))\n+    {\n+      while (atomic_load_acquire (&GL (dl_thp_pagesize_state))\n+\t     != thp_cache_initialized)\n+\tatomic_spin_nop ();\n+      return GL (dl_thp_pagesize);\n+    }\n+\n+  unsigned long int r = 0;\n   int fd = __open64_nocancel (\n     \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\", O_RDONLY);\n   if (fd == -1)\n-    return 0;\n+    goto out;\n \n   char str[INT_BUFSIZE_BOUND (unsigned long int)];\n   ssize_t s = __read_nocancel (fd, str, sizeof (str));\n   __close_nocancel (fd);\n   if (s < 0)\n-    return 0;\n+    goto out;\n \n-  unsigned long int r = 0;\n   for (ssize_t i = 0; i < s; i++)\n     {\n       if (str[i] == '\\n')\n@@ -44,16 +60,36 @@ __get_thp_size (void)\n       r *= 10;\n       r += str[i] - '0';\n     }\n+\n+out:\n+  GL (dl_thp_pagesize) = r;\n+  atomic_store_release (&GL (dl_thp_pagesize_state),\n+\t\t\tthp_cache_initialized);\n   return r;\n }\n \n enum thp_mode_t\n __get_thp_mode (void)\n {\n+  if (atomic_load_acquire (&GL (dl_thp_mode_state))\n+      == thp_cache_initialized)\n+    return (enum thp_mode_t) GL (dl_thp_mode);\n+\n+  int state = thp_cache_uninitialized;\n+  if (!atomic_compare_exchange_acquire (&GL (dl_thp_mode_state),\n+\t\t\t\t\t&state, thp_cache_initializing))\n+    {\n+      while (atomic_load_acquire (&GL (dl_thp_mode_state))\n+\t     != thp_cache_initialized)\n+\tatomic_spin_nop ();\n+      return (enum thp_mode_t) GL (dl_thp_mode);\n+    }\n+\n+  enum thp_mode_t mode = thp_mode_not_supported;\n   int fd = __open64_nocancel (\"/sys/kernel/mm/transparent_hugepage/enabled\",\n \t\t\t      O_RDONLY);\n   if (fd == -1)\n-    return thp_mode_not_supported;\n+    goto out;\n \n   static const char mode_always[]  = \"[always] madvise never\\n\";\n   static const char mode_madvise[] = \"always [madvise] never\\n\";\n@@ -63,19 +99,23 @@ __get_thp_mode (void)\n   ssize_t s = __read_nocancel (fd, str, sizeof (str));\n   __close_nocancel (fd);\n   if (s >= sizeof str || s < 0)\n-    return thp_mode_not_supported;\n+    goto out;\n   str[s] = '\\0';\n \n   if (s == sizeof (mode_always) - 1)\n     {\n       if (strcmp (str, mode_always) == 0)\n-\treturn thp_mode_always;\n+\tmode = thp_mode_always;\n       else if (strcmp (str, mode_madvise) == 0)\n-\treturn thp_mode_madvise;\n+\tmode = thp_mode_madvise;\n       else if (strcmp (str, mode_never) == 0)\n-\treturn thp_mode_never;\n+\tmode = thp_mode_never;\n     }\n-  return thp_mode_not_supported;\n+\n+out:\n+  GL (dl_thp_mode) = mode;\n+  atomic_store_release (&GL (dl_thp_mode_state), thp_cache_initialized);\n+  return mode;\n }\n \n #if !IS_IN (rtld)\n","prefixes":[]}