mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 02:03:35 +08:00
ffb17e7ba3
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>
41 lines
1.3 KiB
C
41 lines
1.3 KiB
C
/* Module with specified TLS size and model.
|
|
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/>. */
|
|
|
|
/* This file is parameterized by macros N, SIZE and MODEL. */
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define CONCATX(x, y) x ## y
|
|
#define CONCAT(x, y) CONCATX (x, y)
|
|
#define STRX(x) #x
|
|
#define STR(x) STRX (x)
|
|
|
|
#define VAR CONCAT (var, N)
|
|
|
|
__attribute__ ((aligned (8), tls_model (MODEL)))
|
|
__thread char VAR[SIZE];
|
|
|
|
void
|
|
CONCAT (access, N) (void)
|
|
{
|
|
printf (STR (VAR) "[%d]:\t %p .. %p " MODEL "\n", SIZE, VAR, VAR + SIZE);
|
|
fflush (stdout);
|
|
memset (VAR, 1, SIZE);
|
|
}
|