git-surplus-tls-accounting
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Tue, 27 May 2025 10:40:04 +0000 (11:40 +0100)
committerSean Whitton <spwhitton@spwhitton.name>
Tue, 27 May 2025 10:40:04 +0000 (11:40 +0100)
commita4ebecec780df92e3b20138963588ae4b4e7dab4
tree9cd504467a5ac1f5ee3f332d21ca61de3581e177
parentc4f50ee4921fe4056ce457a16dfe563979e8d4cd
git-surplus-tls-accounting

commit ffb17e7ba3a5ba9632cee97330b325072fbe41dd
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Wed Jun 10 13:40:40 2020 +0100

    rtld: Avoid using up static TLS surplus for optimizations [BZ #25051]

    On some targets static TLS surplus area can be used opportunistically
    for dynamically loaded modules such that the TLS access then becomes
    faster (TLSDESC and powerpc TLS optimization). However we don't want
    all surplus TLS to be used for this optimization because dynamically
    loaded modules with initial-exec model TLS can only use surplus TLS.

    The new contract for surplus static TLS use is:

    - libc.so can have up to 192 bytes of IE TLS,
    - other system libraries together can have up to 144 bytes of IE TLS.
    - Some "optional" static TLS is available for opportunistic use.

    The optional TLS is now tunable: rtld.optional_static_tls, so users
    can directly affect the allocated static TLS size. (Note that module
    unloading with dlclose does not reclaim static TLS. After the optional
    TLS runs out, TLS access is no longer optimized to use static TLS.)

    The default setting of rtld.optional_static_tls is 512 so the surplus
    TLS is 3*192 + 4*144 + 512 = 1664 by default, the same as before.

    Fixes BZ #25051.

    Tested on aarch64-linux-gnu and x86_64-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
commit 17796419b5fd694348cceb65c3f77601faae082c
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Tue Jul 7 10:49:11 2020 +0100

    rtld: Account static TLS surplus for audit modules

    The new static TLS surplus size computation is

      surplus_tls = 192 * (nns-1) + 144 * nns + 512

    where nns is controlled via the rtld.nns tunable. This commit
    accounts audit modules too so nns = rtld.nns + audit modules.

    rtld.nns should only include the namespaces required by the
    application, namespaces for audit modules are accounted on top
    of that so audit modules don't use up the static TLS that is
    reserved for the application. This allows loading many audit
    modules without tuning rtld.nns or using up static TLS, and it
    fixes

    FAIL: elf/tst-auditmany

    Note that DL_NNS is currently a hard upper limit for nns, and
    if rtld.nns + audit modules go over the limit that's a fatal
    error. By default rtld.nns is 4 which allows 12 audit modules.

    Counting the audit modules is based on existing audit string
    parsing code, we cannot use GLRO(dl_naudit) before the modules
    are actually loaded.

commit 0c7b002fac12dcb2f53ba83ee56bb3b5d2439447
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Tue Jun 9 09:57:28 2020 +0100

    rtld: Add rtld.nns tunable for the number of supported namespaces

    TLS_STATIC_SURPLUS is 1664 bytes currently which is not enough to
    support DL_NNS (== 16) number of dynamic link namespaces, if we
    assume 192 bytes of TLS are reserved for libc use and 144 bytes
    are reserved for other system libraries that use IE TLS.

    A new tunable is introduced to control the number of supported
    namespaces and to adjust the surplus static TLS size as follows:

    surplus_tls = 192 * (rtld.nns-1) + 144 * rtld.nns + 512

    The default is rtld.nns == 4 and then the surplus TLS size is the
    same as before, so the behaviour is unchanged by default. If an
    application creates more namespaces than the rtld.nns setting
    allows, then it is not guaranteed to work, but the limit is not
    checked. So existing usage will continue to work, but in the
    future if an application creates more than 4 dynamic link
    namespaces then the tunable will need to be set.

    In this patch DL_NNS is a fixed value and provides a maximum to
    the rtld.nns setting.

    Static linking used fixed 2048 bytes surplus TLS, this is changed
    so the same contract is used as for dynamic linking.  With static
    linking DL_NNS == 1 so rtld.nns tunable is forced to 1, so by
    default the surplus TLS is reduced to 144 + 512 = 656 bytes. This
    change is not expected to cause problems.

    Tested on aarch64-linux-gnu and x86_64-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
commit 4c6e0415ef206a595c62d5d37e3b9a821782c533
Author: Florian Weimer <fweimer@redhat.com>
Date:   Fri Apr 3 13:17:48 2020 +0200

    elf: Simplify handling of lists of audit strings

    All list elements are colon-separated strings, and there is a hard
    upper limit for the number of audit modules, so it is possible to
    pre-allocate a fixed-size array of strings to which the LD_AUDIT
    environment variable and --audit arguments are added.

    Also eliminate the global variables for the audit list because
    the list is only needed briefly during startup.

    There is a slight behavior change: All duplicate LD_AUDIT environment
    variables are now processed, not just the last one as before.  However,
    such environment vectors are invalid anyway.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Gbp-Pq: Topic any
Gbp-Pq: Name git-surplus-tls-accounting.diff
18 files changed:
csu/libc-tls.c
elf/Makefile
elf/dl-reloc.c
elf/dl-tls.c
elf/dl-tunables.list
elf/dynamic-link.h
elf/rtld.c
elf/tst-tls-ie-dlmopen.c [new file with mode: 0644]
elf/tst-tls-ie-mod.h [new file with mode: 0644]
elf/tst-tls-ie-mod0.c [new file with mode: 0644]
elf/tst-tls-ie-mod1.c [new file with mode: 0644]
elf/tst-tls-ie-mod2.c [new file with mode: 0644]
elf/tst-tls-ie-mod3.c [new file with mode: 0644]
elf/tst-tls-ie-mod4.c [new file with mode: 0644]
elf/tst-tls-ie-mod5.c [new file with mode: 0644]
elf/tst-tls-ie-mod6.c [new file with mode: 0644]
elf/tst-tls-ie.c [new file with mode: 0644]
sysdeps/generic/ldsodefs.h