diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2020-06-09 09:57:28 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2020-07-08 17:32:56 +0100 |
commit | 0c7b002fac12dcb2f53ba83ee56bb3b5d2439447 (patch) | |
tree | cc07f5e054d4aefa382ceeacd458c06fc4205169 /elf/rtld.c | |
parent | ae7a94e5e3edf78f4da562edc05ece229614c716 (diff) | |
download | glibc-0c7b002fac12dcb2f53ba83ee56bb3b5d2439447.zip glibc-0c7b002fac12dcb2f53ba83ee56bb3b5d2439447.tar.gz glibc-0c7b002fac12dcb2f53ba83ee56bb3b5d2439447.tar.bz2 |
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>
Diffstat (limited to 'elf/rtld.c')
-rw-r--r-- | elf/rtld.c | 3 |
1 files changed, 3 insertions, 0 deletions
@@ -780,6 +780,9 @@ init_tls (void) } assert (i == GL(dl_tls_max_dtv_idx)); + /* Calculate the size of the static TLS surplus. */ + _dl_tls_static_surplus_init (); + /* Compute the TLS offsets for the various blocks. */ _dl_determine_tlsoffset (); |