glibc/elf/dl-tunables.list
Adhemerval Zanella bf033c0072 elf: Add glibc.mem.decorate_maps tunable
The PR_SET_VMA_ANON_NAME support is only enabled through a configurable
kernel switch, mainly because assigning a name to a
anonymous virtual memory area might prevent that area from being
merged with adjacent virtual memory areas.

For instance, with the following code:

   void *p1 = mmap (NULL,
                    1024 * 4096,
                    PROT_READ | PROT_WRITE,
                    MAP_PRIVATE | MAP_ANONYMOUS,
                    -1,
                    0);

   void *p2 = mmap (p1 + (1024 * 4096),
                    1024 * 4096,
                    PROT_READ | PROT_WRITE,
                    MAP_PRIVATE | MAP_ANONYMOUS,
                    -1,
                    0);

The kernel will potentially merge both mappings resulting in only one
segment of size 0x800000.  If the segment is names with
PR_SET_VMA_ANON_NAME with different names, it results in two mappings.

Although this will unlikely be an issue for pthread stacks and malloc
arenas (since for pthread stacks the guard page will result in
a PROT_NONE segment, similar to the alignment requirement for the arena
block), it still might prevent the mmap memory allocated for detail
malloc.

There is also another potential scalability issue, where the prctl
requires
to take the mmap global lock which is still not fully fixed in Linux
[1] (for pthread stacks and arenas, it is mitigated by the stack
cached and the arena reuse).

So this patch disables anonymous mapping annotations as default and
add a new tunable, glibc.mem.decorate_maps, can be used to enable
it.

[1] https://lwn.net/Articles/906852/

Checked on x86_64-linux-gnu and aarch64-linux-gnu.
Reviewed-by: DJ Delorie <dj@redhat.com>
2023-11-07 10:27:57 -03:00

192 lines
3.8 KiB
Plaintext

# Copyright (C) 2016-2023 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <https://www.gnu.org/licenses/>.
# Allowed attributes for tunables:
#
# type: Defaults to STRING
# minval: Optional minimum acceptable value
# maxval: Optional maximum acceptable value
# env_alias: An alias environment variable
# security_level: Specify security level of the tunable for AT_SECURE binaries.
# Valid values are:
#
# SXID_ERASE: (default) Do not read and do not pass on to
# child processes.
# SXID_IGNORE: Do not read, but retain for non-AT_SECURE
# subprocesses.
# NONE: Read all the time.
glibc {
malloc {
check {
type: INT_32
minval: 0
maxval: 3
env_alias: MALLOC_CHECK_
}
top_pad {
type: SIZE_T
env_alias: MALLOC_TOP_PAD_
security_level: SXID_IGNORE
default: 131072
}
perturb {
type: INT_32
minval: 0
maxval: 0xff
env_alias: MALLOC_PERTURB_
security_level: SXID_IGNORE
}
mmap_threshold {
type: SIZE_T
env_alias: MALLOC_MMAP_THRESHOLD_
security_level: SXID_IGNORE
}
trim_threshold {
type: SIZE_T
env_alias: MALLOC_TRIM_THRESHOLD_
security_level: SXID_IGNORE
}
mmap_max {
type: INT_32
env_alias: MALLOC_MMAP_MAX_
security_level: SXID_IGNORE
minval: 0
}
arena_max {
type: SIZE_T
env_alias: MALLOC_ARENA_MAX
minval: 1
security_level: SXID_IGNORE
}
arena_test {
type: SIZE_T
env_alias: MALLOC_ARENA_TEST
minval: 1
security_level: SXID_IGNORE
}
tcache_max {
type: SIZE_T
}
tcache_count {
type: SIZE_T
}
tcache_unsorted_limit {
type: SIZE_T
}
mxfast {
type: SIZE_T
minval: 0
security_level: SXID_IGNORE
}
hugetlb {
type: SIZE_T
minval: 0
}
}
cpu {
hwcap_mask {
type: UINT_64
env_alias: LD_HWCAP_MASK
default: HWCAP_IMPORTANT
}
}
elision {
enable {
type: INT_32
minval: 0
maxval: 1
}
skip_lock_busy {
type: INT_32
default: 3
minval: 0
}
skip_lock_internal_abort {
type: INT_32
default: 3
minval: 0
}
skip_lock_after_retries {
type: INT_32
default: 3
minval: 0
}
tries {
type: INT_32
default: 3
minval: 0
}
skip_trylock_internal_abort {
type: INT_32
default: 3
minval: 0
}
}
rtld {
nns {
type: SIZE_T
minval: 1
maxval: 16
default: 4
}
optional_static_tls {
type: SIZE_T
minval: 0
default: 512
}
}
mem {
tagging {
type: INT_32
minval: 0
maxval: 255
security_level: SXID_IGNORE
}
decorate_maps {
type: INT_32
minval: 0
maxval: 1
}
}
rtld {
dynamic_sort {
type: INT_32
minval: 1
maxval: 2
default: 2
}
}
gmon {
minarcs {
type: INT_32
minval: 50
default: 50
}
maxarcs {
type: INT_32
minval: 50
default: 1048576
}
}
}