[PATCH v2] elf: Change TLS static surplus default back to 1664

Vineet Gupta Vineet.Gupta1@synopsys.com
Sun Jul 19 04:39:37 GMT 2020


Hi Florian,

On 7/17/20 4:41 AM, Florian Weimer via Libc-alpha wrote:
> Make the computation in elf/dl-tls.c more transparent, and add
> an explicit test for the historic value.
> 
> ---
>  elf/Makefile          |  4 +++-
>  elf/dl-tls.c          | 37 ++++++++++++++++++++++++++++++-------
>  elf/tst-tls-surplus.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 75 insertions(+), 8 deletions(-)

On ARC, tst-tls-surplus passes, but it seems there's still some static TLS
shenanigans.

FAIL: elf/tst-tls-ie
FAIL: elf/tst-tls-ie-dlmopen

$ cat elf/tst-tls-ie.out

maintls[1000]:	 0x20026f80 .. 0x20027368
var0[480]:	 0x2093c648 .. 0x2093c828 global-dynamic
var1[120]:	 0x2093cc40 .. 0x2093ccb8 global-dynamic
var2[24]:	 0x2093d0d0 .. 0x2093d0e8 global-dynamic
var3[16]:	 0x2093d500 .. 0x2093d510 global-dynamic
error: xdlfcn.c:29: error: dlopen:
glibc-2.31.9000-730-ge9422236a2dd4/build/elf/tst-tls-ie-mod4.so: cannot allocate
memory in static TLS block

cat elf/tst-tls-ie-dlmopen.out
maintls[1000]:	 0x20026f80 .. 0x20027368
var0[480]:	 0x2093c648 .. 0x2093c828 global-dynamic
var1[120]:	 0x2093d3d8 .. 0x2093d450 global-dynamic
var2[24]:	 0x2093e000 .. 0x2093e018 global-dynamic
var3[16]:	 0x2093ebc8 .. 0x2093ebd8 global-dynamic
error: xdlmopen.c:28: error: dlmopen:
glibc-2.31.9000-730-ge9422236a2dd4/build/elf/tst-tls-ie-mod6.so: cannot allocate
memory in static TLS block


> 
> diff --git a/elf/Makefile b/elf/Makefile
> index a2c3b12007..0b78721848 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -216,7 +216,7 @@ tests-internal += loadtest unload unload2 circleload1 \
>  	 neededtest neededtest2 neededtest3 neededtest4 \
>  	 tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
>  	 tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
> -	 tst-create_format1
> +	 tst-create_format1 tst-tls-surplus
>  tests-container += tst-pldd tst-dlopen-tlsmodid-container \
>    tst-dlopen-self-container
>  test-srcs = tst-pathopt
> @@ -1794,3 +1794,5 @@ $(objpfx)tst-tls-ie-dlmopen.out: \
>    $(objpfx)tst-tls-ie-mod4.so \
>    $(objpfx)tst-tls-ie-mod5.so \
>    $(objpfx)tst-tls-ie-mod6.so
> +
> +$(objpfx)tst-tls-surplus: $(libdl)
> diff --git a/elf/dl-tls.c b/elf/dl-tls.c
> index 9a17427047..9fa62f5d22 100644
> --- a/elf/dl-tls.c
> +++ b/elf/dl-tls.c
> @@ -54,13 +54,37 @@
>     Audit modules use their own namespaces, they are not included in rtld.nns,
>     but come on top when computing the number of namespaces.  */
>  
> -/* Size of initial-exec TLS in libc.so.  */
> -#define LIBC_IE_TLS 160
> +/* Size of initial-exec TLS in libc.so.  This should be the maximum of
> +   observed PT_GNU_TLS sizes across all architectures.  Some
> +   architectures have lower values due to differences in type sizes
> +   and link editor capabilities.  */
> +#define LIBC_IE_TLS 144
> +
>  /* Size of initial-exec TLS in libraries other than libc.so.
>     This should be large enough to cover runtime libraries of the
>     compiler such as libgomp and libraries in libc other than libc.so.  */
>  #define OTHER_IE_TLS 144
>  
> +/* Default number of namespaces.  */
> +#define DEFAULT_NNS 4
> +
> +/* Default for dl_tls_static_optional.  */
> +#define OPTIONAL_TLS 512
> +
> +/* Compute the static TLS surplus based on the namespace count and the
> +   TLS space that can be used for optimizations.  */
> +static inline int
> +tls_static_surplus (int nns, int opt_tls)
> +{
> +  return (nns - 1) * LIBC_IE_TLS + nns * OTHER_IE_TLS + opt_tls;
> +}
> +
> +/* This value is chosen so that with default values for the tunables,
> +   the computation of dl_tls_static_surplus in
> +   _dl_tls_static_surplus_init yields the historic value 1664, for
> +   backwards compatibility.  */
> +#define LEGACY_TLS (1664 - tls_static_surplus (DEFAULT_NNS, OPTIONAL_TLS))
> +
>  /* Calculate the size of the static TLS surplus, when the given
>     number of audit modules are loaded.  Must be called after the
>     number of audit modules is known and before static TLS allocation.  */
> @@ -74,8 +98,8 @@ _dl_tls_static_surplus_init (size_t naudit)
>    opt_tls = TUNABLE_GET (optional_static_tls, size_t, NULL);
>  #else
>    /* Default values of the tunables.  */
> -  nns = 4;
> -  opt_tls = 512;
> +  nns = DEFAULT_NNS;
> +  opt_tls = OPTIONAL_TLS;
>  #endif
>    if (nns > DL_NNS)
>      nns = DL_NNS;
> @@ -85,9 +109,8 @@ _dl_tls_static_surplus_init (size_t naudit)
>    nns += naudit;
>  
>    GL(dl_tls_static_optional) = opt_tls;
> -  GLRO(dl_tls_static_surplus) = ((nns - 1) * LIBC_IE_TLS
> -				 + nns * OTHER_IE_TLS
> -				 + opt_tls);
> +  assert (LEGACY_TLS >= 0);
> +  GLRO(dl_tls_static_surplus) = tls_static_surplus (nns, opt_tls) + LEGACY_TLS;
>  }
>  
>  /* Out-of-memory handler.  */
> diff --git a/elf/tst-tls-surplus.c b/elf/tst-tls-surplus.c
> new file mode 100644
> index 0000000000..b0dea0b5ee
> --- /dev/null
> +++ b/elf/tst-tls-surplus.c
> @@ -0,0 +1,42 @@
> +/* Test size of the static TLS surplus reservation for backwards compatibility.
> +   Copyright (C) 2020 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/>.  */
> +
> +#include <stdio.h>
> +#include <support/check.h>
> +#include <support/xdlfcn.h>
> +
> +static int do_test (void);
> +#include <support/test-driver.c>
> +
> +/* This hack results in a definition of struct rtld_global_ro.  Do
> +   this after all the other header inclusions, to minimize the
> +   impact.  */
> +#define SHARED
> +#include <ldsodefs.h>
> +
> +static
> +int do_test (void)
> +{
> +  /* Avoid introducing a copy relocation due to the hidden alias in
> +     ld.so.  */
> +  struct rtld_global_ro *glro = xdlsym (NULL, "_rtld_global_ro");
> +  printf ("info: _dl_tls_static_surplus: %zu\n", glro->_dl_tls_static_surplus);
> +  /* Hisoric value: 16 * 100 + 64.  */
> +  TEST_VERIFY (glro->_dl_tls_static_surplus >= 1664);
> +  return 0;
> +}
> 
> 



More information about the Libc-alpha mailing list