about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--NEWS5
-rw-r--r--elf/Makefile2
-rw-r--r--elf/dl-tunables.list5
-rw-r--r--manual/tunables.texi17
-rw-r--r--sysdeps/unix/sysv/linux/setvmaname.c15
5 files changed, 38 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index 4580fe381d..139cfef1b0 100644
--- a/NEWS
+++ b/NEWS
@@ -38,6 +38,11 @@ Major new features:
   and the wfN format length modifiers for arguments pointing to types
   int_fastN_t or uint_fastN_t, as specified in draft ISO C2X.
 
+* A new tunable, glibc.mem.decorate_maps, can be used to add additional
+  information on underlying memory allocated by the glibc (for instance,
+  on thread stack created by pthread_create or memory allocated by
+  malloc).
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * The ldconfig program now skips file names containing ';' or ending in
diff --git a/elf/Makefile b/elf/Makefile
index 328dbe82de..f9bd86a05a 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -2985,5 +2985,5 @@ $(objpfx)tst-dlclose-lazy.out: \
 $(objpfx)tst-decorate-maps: $(shared-thread-library)
 
 tst-decorate-maps-ENV = \
-  GLIBC_TUNABLES=glibc.malloc.arena_max=8:glibc.malloc.mmap_threshold=1024
+  GLIBC_TUNABLES=glibc.malloc.arena_max=8:glibc.malloc.mmap_threshold=1024:glibc.mem.decorate_maps=1
 tst-decorate-maps-ARGS = 8
diff --git a/elf/dl-tunables.list b/elf/dl-tunables.list
index 695ba7192e..888d2ede04 100644
--- a/elf/dl-tunables.list
+++ b/elf/dl-tunables.list
@@ -160,6 +160,11 @@ glibc {
       maxval: 255
       security_level: SXID_IGNORE
     }
+    decorate_maps {
+      type: INT_32
+      minval: 0
+      maxval: 1
+    }
   }
 
   rtld {
diff --git a/manual/tunables.texi b/manual/tunables.texi
index 776fd93fd9..c28360adcd 100644
--- a/manual/tunables.texi
+++ b/manual/tunables.texi
@@ -653,6 +653,23 @@ support in the kernel if this tunable has any non-zero value.
 The default value is @samp{0}, which disables all memory tagging.
 @end deftp
 
+@deftp Tunable glibc.mem.decorate_maps
+If the kernel supports naming anonymous virtual memory areas (since
+Linux version 5.17, although not always enabled by some kernel
+configurations), this tunable can be used to control whether
+@theglibc{} decorates the underlying memory obtained from operating
+system with a string describing its usage (for instance, on the thread
+stack created by @code{ptthread_create} or memory allocated by
+@code{malloc}).
+
+The process mappings can be obtained by reading the @code{/proc/<pid>maps}
+(with @code{pid} being either the @dfn{process ID} or @code{self} for the
+process own mapping).
+
+This tunable takes a value of 0 and 1, where 1 enables the feature.
+The default value is @samp{0}, which disables the decoration.
+@end deftp
+
 @node gmon Tunables
 @section gmon Tunables
 @cindex gmon tunables
diff --git a/sysdeps/unix/sysv/linux/setvmaname.c b/sysdeps/unix/sysv/linux/setvmaname.c
index 9960ab5917..cd6d571772 100644
--- a/sysdeps/unix/sysv/linux/setvmaname.c
+++ b/sysdeps/unix/sysv/linux/setvmaname.c
@@ -20,6 +20,7 @@
 #include <setvmaname.h>
 #include <sys/prctl.h>
 #include <sysdep.h>
+#include <elf/dl-tunables.h>
 
 /* If PR_SET_VMA_ANON_NAME is not supported by the kernel, prctl returns
    EINVAL.  However, it also returns the same error for invalid argument.
@@ -34,11 +35,15 @@ __set_vma_name (void *start, size_t len, const char *name)
   if (atomic_load_relaxed (&prctl_supported) == 0)
     return;
 
-  int r = INTERNAL_SYSCALL_CALL (prctl, PR_SET_VMA, PR_SET_VMA_ANON_NAME,
-				 start, len, name);
-  if (r == 0 || r != -EINVAL)
-    return;
-
+  /* Set the prctl as not supported to avoid checking the tunable on every
+     call.  */
+  if (TUNABLE_GET (glibc, mem, decorate_maps, int32_t, NULL) != 0)
+    {
+      int r = INTERNAL_SYSCALL_CALL (prctl, PR_SET_VMA, PR_SET_VMA_ANON_NAME,
+				     start, len, name);
+      if (r == 0 || r != -EINVAL)
+	return;
+    }
   atomic_store_relaxed (&prctl_supported, 0);
   return;
 }