diff mbox series

[v3] Define PTHREAD_STACK_MIN to sysconf(_SC_THREAD_STACK_MIN)

Message ID 20210622134631.2842539-1-hjl.tools@gmail.com
State Superseded
Delegated to: Florian Weimer
Headers show
Series [v3] Define PTHREAD_STACK_MIN to sysconf(_SC_THREAD_STACK_MIN) | expand

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

H.J. Lu June 22, 2021, 1:46 p.m. UTC
1. Rename _SC_SIGSTKSZ_SOURCE to _DYNAMIC_STACK_SIZE_SOURCE.
2. The constant PTHREAD_STACK_MIN may be too small for some processors.
When _DYNAMIC_STACK_SIZE_SOURCE or _GNU_SOURCE are defined, define
PTHREAD_STACK_MIN to sysconf(_SC_THREAD_STACK_MIN) which is changed
to MIN (PTHREAD_STACK_MIN, sysconf(_SC_MINSIGSTKSZ)).
3. Consolidate <bits/local_lim.h> with <bits/pthread_stack_min.h> to
provide a target specific constant PTHREAD_STACK_MIN value.
---
 NEWS                                          |   8 +-
 include/bits/local_lim.h                      |   7 ++
 include/features.h                            |  18 ++--
 manual/creature.texi                          |   4 +-
 nptl/tst-context1.c                           |  15 ++-
 stdlib/test-atexit-race-common.c              |  11 +-
 support/support_path_support_time64.c         |   1 +
 sysdeps/posix/sysconf-pthread_stack_min.h     |  29 +++++
 sysdeps/posix/sysconf.c                       |   7 +-
 sysdeps/unix/sysv/linux/Makefile              |   3 +-
 .../unix/sysv/linux/aarch64/bits/local_lim.h  | 101 ------------------
 .../linux/aarch64/bits/pthread_stack_min.h    |  22 ++++
 .../unix/sysv/linux/alpha/bits/local_lim.h    |  99 -----------------
 .../sysv/linux/alpha/bits/pthread_stack_min.h |  20 ++++
 sysdeps/unix/sysv/linux/bits/local_lim.h      |   8 +-
 .../unix/sysv/linux/bits/pthread_stack_min.h  |  20 ++++
 sysdeps/unix/sysv/linux/bits/sigstksz.h       |   2 +-
 sysdeps/unix/sysv/linux/ia64/bits/local_lim.h |  99 -----------------
 .../sysv/linux/ia64/bits/pthread_stack_min.h  |  20 ++++
 sysdeps/unix/sysv/linux/mips/bits/local_lim.h |  99 -----------------
 .../sysv/linux/mips/bits/pthread_stack_min.h  |  20 ++++
 .../unix/sysv/linux/powerpc/bits/local_lim.h  | 100 -----------------
 .../linux/powerpc/bits/pthread_stack_min.h    |  21 ++++
 .../unix/sysv/linux/sparc/bits/local_lim.h    |  99 -----------------
 .../sysv/linux/sparc/bits/pthread_stack_min.h |  20 ++++
 .../sysv/linux/sysconf-pthread_stack_min.h    |  33 ++++++
 26 files changed, 260 insertions(+), 626 deletions(-)
 create mode 100644 include/bits/local_lim.h
 create mode 100644 sysdeps/posix/sysconf-pthread_stack_min.h
 delete mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
 delete mode 100644 sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
 delete mode 100644 sysdeps/unix/sysv/linux/mips/bits/local_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h

Comments

Carlos O'Donell July 9, 2021, 6:51 p.m. UTC | #1
On 6/22/21 9:46 AM, H.J. Lu via Libc-alpha wrote:
> 1. Rename _SC_SIGSTKSZ_SOURCE to _DYNAMIC_STACK_SIZE_SOURCE.

This resolves Florian's comments from v2.

I see Joseph's comments from v1 are also resolved.

I have a few comments, but I think we're largely ready to cover
the entire set of minimum signal and thread stack sizes.

> 2. The constant PTHREAD_STACK_MIN may be too small for some processors.
> When _DYNAMIC_STACK_SIZE_SOURCE or _GNU_SOURCE are defined, define
> PTHREAD_STACK_MIN to sysconf(_SC_THREAD_STACK_MIN) which is changed
> to MIN (PTHREAD_STACK_MIN, sysconf(_SC_MINSIGSTKSZ)).
> 3. Consolidate <bits/local_lim.h> with <bits/pthread_stack_min.h> to
> provide a target specific constant PTHREAD_STACK_MIN value.

Please post a v3 and then I think we're ready.

Requests:
- Static inline?
- Rename to match existing pattern of functions __get* in sysconf.
- Suggest add comment about __pthread_get_minstack@GLIBC_PRIVATE

> ---
>  NEWS                                          |   8 +-
>  include/bits/local_lim.h                      |   7 ++
>  include/features.h                            |  18 ++--
>  manual/creature.texi                          |   4 +-

The manual change resolves Josephs comments from v1.

>  nptl/tst-context1.c                           |  15 ++-
>  stdlib/test-atexit-race-common.c              |  11 +-
>  support/support_path_support_time64.c         |   1 +
>  sysdeps/posix/sysconf-pthread_stack_min.h     |  29 +++++
>  sysdeps/posix/sysconf.c                       |   7 +-
>  sysdeps/unix/sysv/linux/Makefile              |   3 +-
>  .../unix/sysv/linux/aarch64/bits/local_lim.h  | 101 ------------------
>  .../linux/aarch64/bits/pthread_stack_min.h    |  22 ++++
>  .../unix/sysv/linux/alpha/bits/local_lim.h    |  99 -----------------
>  .../sysv/linux/alpha/bits/pthread_stack_min.h |  20 ++++
>  sysdeps/unix/sysv/linux/bits/local_lim.h      |   8 +-
>  .../unix/sysv/linux/bits/pthread_stack_min.h  |  20 ++++
>  sysdeps/unix/sysv/linux/bits/sigstksz.h       |   2 +-
>  sysdeps/unix/sysv/linux/ia64/bits/local_lim.h |  99 -----------------
>  .../sysv/linux/ia64/bits/pthread_stack_min.h  |  20 ++++
>  sysdeps/unix/sysv/linux/mips/bits/local_lim.h |  99 -----------------
>  .../sysv/linux/mips/bits/pthread_stack_min.h  |  20 ++++
>  .../unix/sysv/linux/powerpc/bits/local_lim.h  | 100 -----------------
>  .../linux/powerpc/bits/pthread_stack_min.h    |  21 ++++
>  .../unix/sysv/linux/sparc/bits/local_lim.h    |  99 -----------------
>  .../sysv/linux/sparc/bits/pthread_stack_min.h |  20 ++++
>  .../sysv/linux/sysconf-pthread_stack_min.h    |  33 ++++++
>  26 files changed, 260 insertions(+), 626 deletions(-)
>  create mode 100644 include/bits/local_lim.h
>  create mode 100644 sysdeps/posix/sysconf-pthread_stack_min.h
>  delete mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
>  create mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
>  delete mode 100644 sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
>  create mode 100644 sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
>  delete mode 100644 sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
>  create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
>  delete mode 100644 sysdeps/unix/sysv/linux/mips/bits/local_lim.h
>  create mode 100644 sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
>  delete mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
>  create mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
>  create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
>  create mode 100644 sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
> 
> diff --git a/NEWS b/NEWS
> index 58cf1dab68..dc31e4bffa 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -9,8 +9,12 @@ Version 2.34
>  
>  Major new features:
>  
> -* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _SC_SIGSTKSZ_SOURCE or
> -  _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
> +* When _DYNAMIC_STACK_SIZE_SOURCE or _GNU_SOURCE are defined,
> +  PTHREAD_STACK_MIN is no longer constant and is redefined to
> +  sysconf(_SC_THREAD_STACK_MIN).
> +
> +* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _DYNAMIC_STACK_SIZE_SOURCE
> +  or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
>    constant on Linux.  MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)
>    and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).

Perfect. Both are now under _DYNAMIC_STACK_SIZE_SOURCe for signals or
threads.

>  
> diff --git a/include/bits/local_lim.h b/include/bits/local_lim.h
> new file mode 100644
> index 0000000000..46d82dc729
> --- /dev/null
> +++ b/include/bits/local_lim.h
> @@ -0,0 +1,7 @@
> +/* Don't define PTHREAD_STACK_MIN to sysconf (_SC_THREAD_STACK_MIN) for
> +   glibc build.  */
> +#if !defined _ISOMAC
> +# undef __USE_DYNAMIC_STACK_SIZE
> +#endif
> +
> +#include_next <bits/local_lim.h>
> diff --git a/include/features.h b/include/features.h
> index 039bcb112b..51c8a98fb0 100644
> --- a/include/features.h
> +++ b/include/features.h
> @@ -50,8 +50,8 @@
>     _LARGEFILE64_SOURCE	Additional functionality from LFS for large files.
>     _FILE_OFFSET_BITS=N	Select default filesystem interface.
>     _ATFILE_SOURCE	Additional *at interfaces.
> -   _SC_SIGSTKSZ_SOURCE	Select correct (but non compile-time constant)
> -			MINSIGSTKSZ and SIGSTKSZ.
> +   _DYNAMIC_STACK_SIZE_SOURCE Select correct (but non compile-time constant)
> +			MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN.
>     _GNU_SOURCE		All of the above, plus GNU extensions.
>     _DEFAULT_SOURCE	The default set of features (taking precedence over
>  			__STRICT_ANSI__).
> @@ -98,8 +98,8 @@
>     __USE_FILE_OFFSET64	Define 64bit interface as default.
>     __USE_MISC		Define things from 4.3BSD or System V Unix.
>     __USE_ATFILE		Define *at interfaces and AT_* constants for them.
> -   __USE_SC_SIGSTKSZ	Define correct (but non compile-time constant)
> -			MINSIGSTKSZ and SIGSTKSZ.
> +   __USE_DYNAMIC_STACK_SIZE Define correct (but non compile-time constant)
> +			MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN.
>     __USE_GNU		Define GNU extensions.
>     __USE_FORTIFY_LEVEL	Additional security measures used, according to level.
>  
> @@ -143,7 +143,7 @@
>  #undef	__USE_FILE_OFFSET64
>  #undef	__USE_MISC
>  #undef	__USE_ATFILE
> -#undef	__USE_SC_SIGSTKSZ
> +#undef	__USE_DYNAMIC_STACK_SIZE

OK.

>  #undef	__USE_GNU
>  #undef	__USE_FORTIFY_LEVEL
>  #undef	__KERNEL_STRICT_NAMES
> @@ -220,8 +220,8 @@
>  # define _DEFAULT_SOURCE	1
>  # undef  _ATFILE_SOURCE
>  # define _ATFILE_SOURCE	1
> -# undef  _SC_SIGSTKSZ_SOURCE
> -# define _SC_SIGSTKSZ_SOURCE 1
> +# undef  _DYNAMIC_STACK_SIZE_SOURCE
> +# define _DYNAMIC_STACK_SIZE_SOURCE 1
>  #endif
>  
>  /* If nothing (other than _GNU_SOURCE and _DEFAULT_SOURCE) is defined,
> @@ -399,8 +399,8 @@
>  # define __USE_ATFILE	1
>  #endif
>  
> -#ifdef	_SC_SIGSTKSZ_SOURCE
> -# define __USE_SC_SIGSTKSZ	1
> +#ifdef	_DYNAMIC_STACK_SIZE_SOURCE
> +# define __USE_DYNAMIC_STACK_SIZE	1
>  #endif
>  
>  #ifdef	_GNU_SOURCE
> diff --git a/manual/creature.texi b/manual/creature.texi
> index 9fa658e9a7..fdd16f49cf 100644
> --- a/manual/creature.texi
> +++ b/manual/creature.texi
> @@ -309,10 +309,10 @@ checks are applied. If defined to @math{3}, @theglibc{} may also use
>  checks that may have an additional performance overhead.
>  @end defvr
>  
> -@defvr Macro _SC_SIGSTKSZ_SOURCE
> +@defvr Macro _DYNAMIC_STACK_SIZE_SOURCE

OK. Resolves Joseph's comments.

>  @standards{GNU, (none)}
>  If this macro is defined, correct (but non compile-time constant)
> -MINSIGSTKSZ and SIGSTKSZ are defined.
> +MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN are defined.
>  @end defvr
>  
>  @defvr Macro _REENTRANT
> diff --git a/nptl/tst-context1.c b/nptl/tst-context1.c
> index 821f3c2133..00e39aff9f 100644
> --- a/nptl/tst-context1.c
> +++ b/nptl/tst-context1.c
> @@ -23,6 +23,7 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <ucontext.h>
> +#include <support/support.h>
>  
>  #define N	4
>  #if __WORDSIZE == 64
> @@ -36,7 +37,8 @@ typedef struct {
>         unsigned long	guard[3];
>     } tst_context_t;
>  
> -static char stacks[N][2 * PTHREAD_STACK_MIN];
> +static char *stacks[N];
> +static size_t stack_size;
>  static tst_context_t ctx[N][2];
>  static volatile int failures;
>  
> @@ -79,7 +81,7 @@ fct (long int n)
>        exit (1);
>      }
>  
> -  if (on_stack < stacks[n] || on_stack >= stacks[n] + sizeof (stacks[0]))
> +  if (on_stack < stacks[n] || on_stack >= stacks[n] + stack_size)
>      {
>        printf ("%ld: on_stack not on appropriate stack\n", n);
>        exit (1);
> @@ -109,7 +111,7 @@ tf (void *arg)
>    printf ("%d: %s: before makecontext\n", n, __FUNCTION__);
>  
>    ctx[n][1].uctx.uc_stack.ss_sp = stacks[n];
> -  ctx[n][1].uctx.uc_stack.ss_size = sizeof (stacks[n]);
> +  ctx[n][1].uctx.uc_stack.ss_size = stack_size;
>    ctx[n][1].uctx.uc_link = &ctx[n][0].uctx;
>    makecontext (&ctx[n][1].uctx, (void (*) (void)) fct, 1, (long int) n);
>  
> @@ -137,6 +139,10 @@ do_test (void)
>    pthread_t th[N];
>    ucontext_t mctx;
>  
> +  stack_size = 2 * PTHREAD_STACK_MIN;
> +  for (int i = 0; i < N; i++)
> +    stacks[i] = xmalloc (stack_size);
> +
>    puts ("making contexts");
>    if (getcontext (&mctx) != 0)
>      {
> @@ -198,6 +204,9 @@ do_test (void)
>  	exit (1);
>        }
>  
> +  for (int i = 0; i < N; i++)
> +    free (stacks[i]);
> +
>    return failures;
>  }
>  
> diff --git a/stdlib/test-atexit-race-common.c b/stdlib/test-atexit-race-common.c
> index a2b5468580..b48bb16285 100644
> --- a/stdlib/test-atexit-race-common.c
> +++ b/stdlib/test-atexit-race-common.c
> @@ -38,11 +38,6 @@
>  
>  const size_t kNumThreads = 1024;
>  const size_t kNumHandlers = 1024;
> -const size_t kStacksize =
> -#ifdef PTHREAD_STACK_MIN
> -	0x20000 < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN :
> -#endif
> -		0x20000;
>  
>  static void *
>  threadfunc (void *unused)
> @@ -66,6 +61,12 @@ do_test (void)
>    /* With default 8MiB Linux stack size, creating 1024 threads can cause
>       VM exhausiton on 32-bit machines.  Reduce stack size of each thread to
>       128KiB for a maximum required VM size of 128MiB.  */
> +  size_t kStacksize =
> +#ifdef PTHREAD_STACK_MIN
> +    0x20000 < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN :
> +#endif
> +    0x20000;
> +
>    xpthread_attr_setstacksize (&attr, kStacksize);
>  
>    for (i = 0; i < kNumThreads; ++i) {
> diff --git a/support/support_path_support_time64.c b/support/support_path_support_time64.c
> index 33b2bdff66..619a4eab00 100644
> --- a/support/support_path_support_time64.c
> +++ b/support/support_path_support_time64.c
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <fcntl.h>
> +#include <unistd.h>
>  #include <support/check.h>
>  #include <support/support.h>
>  #include <sys/stat.h>
> diff --git a/sysdeps/posix/sysconf-pthread_stack_min.h b/sysdeps/posix/sysconf-pthread_stack_min.h
> new file mode 100644
> index 0000000000..4b1dabc79a
> --- /dev/null
> +++ b/sysdeps/posix/sysconf-pthread_stack_min.h
> @@ -0,0 +1,29 @@
> +/* sysconf_pthread_stack_min ().  POSIX version.
> +   Copyright (C) 2021 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/>.  */
> +
> +/* Return sysconf (_SC_THREAD_STACK_MIN).  */
> +
> +static long int
> +sysconf_pthread_stack_min (void)

Static inline?

__get_pthread_stack_min? To follow the design pattern of __get* functions.

> +{
> +#ifdef	PTHREAD_STACK_MIN
> +      return PTHREAD_STACK_MIN;
> +#else
> +      return -1;
> +#endif
> +}
> diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c
> index 54d6046d00..c505995cc1 100644
> --- a/sysdeps/posix/sysconf.c
> +++ b/sysdeps/posix/sysconf.c
> @@ -31,6 +31,7 @@
>  #include <sys/types.h>
>  #include <sys/uio.h>
>  #include <regex.h>
> +#include <sysconf-pthread_stack_min.h>
>  
>  #define NEED_SPEC_ARRAY 0
>  #include <posix-conf-vars.h>
> @@ -569,11 +570,7 @@ __sysconf (int name)
>  #endif
>  
>      case _SC_THREAD_STACK_MIN:
> -#ifdef	PTHREAD_STACK_MIN
> -      return PTHREAD_STACK_MIN;
> -#else
> -      return -1;
> -#endif
> +      return sysconf_pthread_stack_min ();
>  
>      case _SC_THREAD_THREADS_MAX:
>  #ifdef	PTHREAD_THREADS_MAX
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 294c366e3b..4613f7263f 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -107,7 +107,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
>  		  bits/types/struct_semid64_ds.h \
>  		  bits/types/struct_semid64_ds_helper.h \
>  		  bits/types/struct_shmid64_ds.h \
> -		  bits/types/struct_shmid64_ds_helper.h
> +		  bits/types/struct_shmid64_ds_helper.h \
> +		  bits/pthread_stack_min.h
>  
>  tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
>  	 tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
> diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h b/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
> deleted file mode 100644
> index 0652bf4a06..0000000000
> --- a/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
> +++ /dev/null
> @@ -1,101 +0,0 @@
> -/* Minimum guaranteed maximum values for system limits.  Linux version.
> -   Copyright (C) 1993-2021 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/>.  */
> -
> -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> -   and defines LINK_MAX although filesystems have different maxima.  A
> -   similar thing is true for OPEN_MAX: the limit can be changed at
> -   runtime and therefore the macro must not be defined.  Remove this
> -   after including the header if necessary.  */
> -#ifndef NR_OPEN
> -# define __undef_NR_OPEN
> -#endif
> -#ifndef LINK_MAX
> -# define __undef_LINK_MAX
> -#endif
> -#ifndef OPEN_MAX
> -# define __undef_OPEN_MAX
> -#endif
> -#ifndef ARG_MAX
> -# define __undef_ARG_MAX
> -#endif
> -
> -/* The kernel sources contain a file with all the needed information.  */
> -#include <linux/limits.h>
> -
> -/* Have to remove NR_OPEN?  */
> -#ifdef __undef_NR_OPEN
> -# undef NR_OPEN
> -# undef __undef_NR_OPEN
> -#endif
> -/* Have to remove LINK_MAX?  */
> -#ifdef __undef_LINK_MAX
> -# undef LINK_MAX
> -# undef __undef_LINK_MAX
> -#endif
> -/* Have to remove OPEN_MAX?  */
> -#ifdef __undef_OPEN_MAX
> -# undef OPEN_MAX
> -# undef __undef_OPEN_MAX
> -#endif
> -/* Have to remove ARG_MAX?  */
> -#ifdef __undef_ARG_MAX
> -# undef ARG_MAX
> -# undef __undef_ARG_MAX
> -#endif
> -
> -/* The number of data keys per process.  */
> -#define _POSIX_THREAD_KEYS_MAX	128
> -/* This is the value this implementation supports.  */
> -#define PTHREAD_KEYS_MAX	1024
> -
> -/* Controlling the iterations of destructors for thread-specific data.  */
> -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
> -/* Number of iterations this implementation does.  */
> -#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
> -
> -/* The number of threads per process.  */
> -#define _POSIX_THREAD_THREADS_MAX	64
> -/* We have no predefined limit on the number of threads.  */
> -#undef PTHREAD_THREADS_MAX
> -
> -/* Maximum amount by which a process can descrease its asynchronous I/O
> -   priority level.  */
> -#define AIO_PRIO_DELTA_MAX	20
> -
> -/* Minimum size for a thread.  At least two pages for systems with 64k
> -   pages.  */
> -#define PTHREAD_STACK_MIN	131072
> -
> -/* Maximum number of timer expiration overruns.  */
> -#define DELAYTIMER_MAX	2147483647
> -
> -/* Maximum tty name length.  */
> -#define TTY_NAME_MAX		32
> -
> -/* Maximum login name length.  This is arbitrary.  */
> -#define LOGIN_NAME_MAX		256
> -
> -/* Maximum host name length.  */
> -#define HOST_NAME_MAX		64
> -
> -/* Maximum message queue priority level.  */
> -#define MQ_PRIO_MAX		32768
> -
> -/* Maximum value the semaphore can have.  */
> -#define SEM_VALUE_MAX   (2147483647)
> diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..97215687ad
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
> @@ -0,0 +1,22 @@
> +/* Definition of PTHREAD_STACK_MIN.  Linux/aarch64 version.
> +   Copyright (C) 2021 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/>.  */
> +
> +/* Minimum size for a thread.  At least two pages for systems with 64k
> +   pages.  */
> +#define PTHREAD_STACK_MIN	131072
> diff --git a/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h b/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
> deleted file mode 100644
> index 523407dc48..0000000000
> --- a/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
> +++ /dev/null
> @@ -1,99 +0,0 @@
> -/* Minimum guaranteed maximum values for system limits.  Linux/Alpha version.
> -   Copyright (C) 1993-2021 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 Library General Public License as
> -   published by the Free Software Foundation; either version 2 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
> -   Library General Public License for more details.
> -
> -   You should have received a copy of the GNU Library General Public
> -   License along with the GNU C Library.  If not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> -   and defines LINK_MAX although filesystems have different maxima.  A
> -   similar thing is true for OPEN_MAX: the limit can be changed at
> -   runtime and therefore the macro must not be defined.  Remove this
> -   after including the header if necessary.  */
> -#ifndef NR_OPEN
> -# define __undef_NR_OPEN
> -#endif
> -#ifndef LINK_MAX
> -# define __undef_LINK_MAX
> -#endif
> -#ifndef OPEN_MAX
> -# define __undef_OPEN_MAX
> -#endif
> -#ifndef ARG_MAX
> -# define __undef_ARG_MAX
> -#endif
> -
> -/* The kernel sources contain a file with all the needed information.  */
> -#include <linux/limits.h>
> -
> -/* Have to remove NR_OPEN?  */
> -#ifdef __undef_NR_OPEN
> -# undef NR_OPEN
> -# undef __undef_NR_OPEN
> -#endif
> -/* Have to remove LINK_MAX?  */
> -#ifdef __undef_LINK_MAX
> -# undef LINK_MAX
> -# undef __undef_LINK_MAX
> -#endif
> -/* Have to remove OPEN_MAX?  */
> -#ifdef __undef_OPEN_MAX
> -# undef OPEN_MAX
> -# undef __undef_OPEN_MAX
> -#endif
> -/* Have to remove ARG_MAX?  */
> -#ifdef __undef_ARG_MAX
> -# undef ARG_MAX
> -# undef __undef_ARG_MAX
> -#endif
> -
> -/* The number of data keys per process.  */
> -#define _POSIX_THREAD_KEYS_MAX	128
> -/* This is the value this implementation supports.  */
> -#define PTHREAD_KEYS_MAX	1024
> -
> -/* Controlling the iterations of destructors for thread-specific data.  */
> -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
> -/* Number of iterations this implementation does.  */
> -#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
> -
> -/* The number of threads per process.  */
> -#define _POSIX_THREAD_THREADS_MAX	64
> -/* We have no predefined limit on the number of threads.  */
> -#undef PTHREAD_THREADS_MAX
> -
> -/* Maximum amount by which a process can descrease its asynchronous I/O
> -   priority level.  */
> -#define AIO_PRIO_DELTA_MAX	20
> -
> -/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> -#define PTHREAD_STACK_MIN	24576
> -
> -/* Maximum number of timer expiration overruns.  */
> -#define DELAYTIMER_MAX	2147483647
> -
> -/* Maximum tty name length.  */
> -#define TTY_NAME_MAX		32
> -
> -/* Maximum login name length.  This is arbitrary.  */
> -#define LOGIN_NAME_MAX		256
> -
> -/* Maximum host name length.  */
> -#define HOST_NAME_MAX		64
> -
> -/* Maximum message queue priority level.  */
> -#define MQ_PRIO_MAX		32768
> -
> -/* Maximum value the semaphore can have.  */
> -#define SEM_VALUE_MAX   (2147483647)
> diff --git a/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..5bfb0e10dd
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
> @@ -0,0 +1,20 @@
> +/* Definition of PTHREAD_STACK_MIN.  Linux/Alpha version.
> +   Copyright (C) 2021 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 Library General Public License as
> +   published by the Free Software Foundation; either version 2 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
> +   Library General Public License for more details.
> +
> +   You should have received a copy of the GNU Library General Public
> +   License along with the GNU C Library.  If not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> +#define PTHREAD_STACK_MIN	24576
> diff --git a/sysdeps/unix/sysv/linux/bits/local_lim.h b/sysdeps/unix/sysv/linux/bits/local_lim.h
> index b88ca3d4d2..0b1c7f40be 100644
> --- a/sysdeps/unix/sysv/linux/bits/local_lim.h
> +++ b/sysdeps/unix/sysv/linux/bits/local_lim.h
> @@ -78,7 +78,13 @@
>  #define AIO_PRIO_DELTA_MAX	20
>  
>  /* Minimum size for a thread.  We are free to choose a reasonable value.  */
> -#define PTHREAD_STACK_MIN	16384
> +#undef PTHREAD_STACK_MIN
> +#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE
> +# include <unistd.h>
> +# define PTHREAD_STACK_MIN	sysconf (_SC_THREAD_STACK_MIN)
> +#else
> +# include <bits/pthread_stack_min.h>
> +#endif
>  
>  /* Maximum number of timer expiration overruns.  */
>  #define DELAYTIMER_MAX	2147483647
> diff --git a/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..7bd6fa1242
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
> @@ -0,0 +1,20 @@
> +/* Definition of PTHREAD_STACK_MIN.  Linux version.
> +   Copyright (C) 2021 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/>.  */
> +
> +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> +#define PTHREAD_STACK_MIN	16384
> diff --git a/sysdeps/unix/sysv/linux/bits/sigstksz.h b/sysdeps/unix/sysv/linux/bits/sigstksz.h
> index 926508f2b4..cd45d122e0 100644
> --- a/sysdeps/unix/sysv/linux/bits/sigstksz.h
> +++ b/sysdeps/unix/sysv/linux/bits/sigstksz.h
> @@ -20,7 +20,7 @@
>  # error "Never include <bits/sigstksz.h> directly; use <signal.h> instead."
>  #endif
>  
> -#if defined __USE_SC_SIGSTKSZ && __USE_SC_SIGSTKSZ
> +#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE
>  # include <unistd.h>
>  
>  /* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */
> diff --git a/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h b/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
> deleted file mode 100644
> index 7a9f677ec8..0000000000
> --- a/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
> +++ /dev/null
> @@ -1,99 +0,0 @@
> -/* Minimum guaranteed maximum values for system limits.  Linux/IA-64 version.
> -   Copyright (C) 1993-2021 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/>.  */
> -
> -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> -   and defines LINK_MAX although filesystems have different maxima.  A
> -   similar thing is true for OPEN_MAX: the limit can be changed at
> -   runtime and therefore the macro must not be defined.  Remove this
> -   after including the header if necessary.  */
> -#ifndef NR_OPEN
> -# define __undef_NR_OPEN
> -#endif
> -#ifndef LINK_MAX
> -# define __undef_LINK_MAX
> -#endif
> -#ifndef OPEN_MAX
> -# define __undef_OPEN_MAX
> -#endif
> -#ifndef ARG_MAX
> -# define __undef_ARG_MAX
> -#endif
> -
> -/* The kernel sources contain a file with all the needed information.  */
> -#include <linux/limits.h>
> -
> -/* Have to remove NR_OPEN?  */
> -#ifdef __undef_NR_OPEN
> -# undef NR_OPEN
> -# undef __undef_NR_OPEN
> -#endif
> -/* Have to remove LINK_MAX?  */
> -#ifdef __undef_LINK_MAX
> -# undef LINK_MAX
> -# undef __undef_LINK_MAX
> -#endif
> -/* Have to remove OPEN_MAX?  */
> -#ifdef __undef_OPEN_MAX
> -# undef OPEN_MAX
> -# undef __undef_OPEN_MAX
> -#endif
> -/* Have to remove ARG_MAX?  */
> -#ifdef __undef_ARG_MAX
> -# undef ARG_MAX
> -# undef __undef_ARG_MAX
> -#endif
> -
> -/* The number of data keys per process.  */
> -#define _POSIX_THREAD_KEYS_MAX	128
> -/* This is the value this implementation supports.  */
> -#define PTHREAD_KEYS_MAX	1024
> -
> -/* Controlling the iterations of destructors for thread-specific data.  */
> -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
> -/* Number of iterations this implementation does.  */
> -#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
> -
> -/* The number of threads per process.  */
> -#define _POSIX_THREAD_THREADS_MAX	64
> -/* We have no predefined limit on the number of threads.  */
> -#undef PTHREAD_THREADS_MAX
> -
> -/* Maximum amount by which a process can descrease its asynchronous I/O
> -   priority level.  */
> -#define AIO_PRIO_DELTA_MAX	20
> -
> -/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> -#define PTHREAD_STACK_MIN	196608
> -
> -/* Maximum number of timer expiration overruns.  */
> -#define DELAYTIMER_MAX	2147483647
> -
> -/* Maximum tty name length.  */
> -#define TTY_NAME_MAX		32
> -
> -/* Maximum login name length.  This is arbitrary.  */
> -#define LOGIN_NAME_MAX		256
> -
> -/* Maximum host name length.  */
> -#define HOST_NAME_MAX		64
> -
> -/* Maximum message queue priority level.  */
> -#define MQ_PRIO_MAX		32768
> -
> -/* Maximum value the semaphore can have.  */
> -#define SEM_VALUE_MAX   (2147483647)
> diff --git a/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..73581506b2
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
> @@ -0,0 +1,20 @@
> +/* Definition of PTHREAD_STACK_MIN.  Linux/IA-64 version.
> +   Copyright (C) 2021 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/>.  */
> +
> +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> +#define PTHREAD_STACK_MIN	196608
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/local_lim.h b/sysdeps/unix/sysv/linux/mips/bits/local_lim.h
> deleted file mode 100644
> index a6a0d8a980..0000000000
> --- a/sysdeps/unix/sysv/linux/mips/bits/local_lim.h
> +++ /dev/null
> @@ -1,99 +0,0 @@
> -/* Minimum guaranteed maximum values for system limits.  MIPS Linux version.
> -   Copyright (C) 1993-2021 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/>.  */
> -
> -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> -   and defines LINK_MAX although filesystems have different maxima.  A
> -   similar thing is true for OPEN_MAX: the limit can be changed at
> -   runtime and therefore the macro must not be defined.  Remove this
> -   after including the header if necessary.  */
> -#ifndef NR_OPEN
> -# define __undef_NR_OPEN
> -#endif
> -#ifndef LINK_MAX
> -# define __undef_LINK_MAX
> -#endif
> -#ifndef OPEN_MAX
> -# define __undef_OPEN_MAX
> -#endif
> -#ifndef ARG_MAX
> -# define __undef_ARG_MAX
> -#endif
> -
> -/* The kernel sources contain a file with all the needed information.  */
> -#include <linux/limits.h>
> -
> -/* Have to remove NR_OPEN?  */
> -#ifdef __undef_NR_OPEN
> -# undef NR_OPEN
> -# undef __undef_NR_OPEN
> -#endif
> -/* Have to remove LINK_MAX?  */
> -#ifdef __undef_LINK_MAX
> -# undef LINK_MAX
> -# undef __undef_LINK_MAX
> -#endif
> -/* Have to remove OPEN_MAX?  */
> -#ifdef __undef_OPEN_MAX
> -# undef OPEN_MAX
> -# undef __undef_OPEN_MAX
> -#endif
> -/* Have to remove ARG_MAX?  */
> -#ifdef __undef_ARG_MAX
> -# undef ARG_MAX
> -# undef __undef_ARG_MAX
> -#endif
> -
> -/* The number of data keys per process.  */
> -#define _POSIX_THREAD_KEYS_MAX	128
> -/* This is the value this implementation supports.  */
> -#define PTHREAD_KEYS_MAX	1024
> -
> -/* Controlling the iterations of destructors for thread-specific data.  */
> -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
> -/* Number of iterations this implementation does.  */
> -#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
> -
> -/* The number of threads per process.  */
> -#define _POSIX_THREAD_THREADS_MAX	64
> -/* We have no predefined limit on the number of threads.  */
> -#undef PTHREAD_THREADS_MAX
> -
> -/* Maximum amount by which a process can descrease its asynchronous I/O
> -   priority level.  */
> -#define AIO_PRIO_DELTA_MAX	20
> -
> -/* Minimum size for a thread.  At least two pages with 64k pages.  */
> -#define PTHREAD_STACK_MIN	131072
> -
> -/* Maximum number of timer expiration overruns.  */
> -#define DELAYTIMER_MAX	2147483647
> -
> -/* Maximum tty name length.  */
> -#define TTY_NAME_MAX		32
> -
> -/* Maximum login name length.  This is arbitrary.  */
> -#define LOGIN_NAME_MAX		256
> -
> -/* Maximum host name length.  */
> -#define HOST_NAME_MAX		64
> -
> -/* Maximum message queue priority level.  */
> -#define MQ_PRIO_MAX		32768
> -
> -/* Maximum value the semaphore can have.  */
> -#define SEM_VALUE_MAX   (2147483647)
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..132f1704a5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
> @@ -0,0 +1,20 @@
> +/* Definition of PTHREAD_STACK_MIN.  MIPS Linux version.
> +   Copyright (C) 2021 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/>.  */
> +
> +/* Minimum size for a thread.  At least two pages with 64k pages.  */
> +#define PTHREAD_STACK_MIN	131072
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h b/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
> deleted file mode 100644
> index 6caa627506..0000000000
> --- a/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -/* Minimum guaranteed maximum values for system limits.  Linux/PPC version.
> -   Copyright (C) 1993-2021 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; see the file COPYING.LIB.  If
> -   not, see <https://www.gnu.org/licenses/>.  */
> -
> -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> -   and defines LINK_MAX although filesystems have different maxima.  A
> -   similar thing is true for OPEN_MAX: the limit can be changed at
> -   runtime and therefore the macro must not be defined.  Remove this
> -   after including the header if necessary.  */
> -#ifndef NR_OPEN
> -# define __undef_NR_OPEN
> -#endif
> -#ifndef LINK_MAX
> -# define __undef_LINK_MAX
> -#endif
> -#ifndef OPEN_MAX
> -# define __undef_OPEN_MAX
> -#endif
> -#ifndef ARG_MAX
> -# define __undef_ARG_MAX
> -#endif
> -
> -/* The kernel sources contain a file with all the needed information.  */
> -#include <linux/limits.h>
> -
> -/* Have to remove NR_OPEN?  */
> -#ifdef __undef_NR_OPEN
> -# undef NR_OPEN
> -# undef __undef_NR_OPEN
> -#endif
> -/* Have to remove LINK_MAX?  */
> -#ifdef __undef_LINK_MAX
> -# undef LINK_MAX
> -# undef __undef_LINK_MAX
> -#endif
> -/* Have to remove OPEN_MAX?  */
> -#ifdef __undef_OPEN_MAX
> -# undef OPEN_MAX
> -# undef __undef_OPEN_MAX
> -#endif
> -/* Have to remove ARG_MAX?  */
> -#ifdef __undef_ARG_MAX
> -# undef ARG_MAX
> -# undef __undef_ARG_MAX
> -#endif
> -
> -/* The number of data keys per process.  */
> -#define _POSIX_THREAD_KEYS_MAX	128
> -/* This is the value this implementation supports.  */
> -#define PTHREAD_KEYS_MAX	1024
> -
> -/* Controlling the iterations of destructors for thread-specific data.  */
> -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
> -/* Number of iterations this implementation does.  */
> -#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
> -
> -/* The number of threads per process.  */
> -#define _POSIX_THREAD_THREADS_MAX	64
> -/* We have no predefined limit on the number of threads.  */
> -#undef PTHREAD_THREADS_MAX
> -
> -/* Maximum amount by which a process can descrease its asynchronous I/O
> -   priority level.  */
> -#define AIO_PRIO_DELTA_MAX	20
> -
> -/* Minimum size for a thread.  At least two pages for systems with 64k
> -   pages.  */
> -#define PTHREAD_STACK_MIN	131072
> -
> -/* Maximum number of timer expiration overruns.  */
> -#define DELAYTIMER_MAX	2147483647
> -
> -/* Maximum tty name length.  */
> -#define TTY_NAME_MAX		32
> -
> -/* Maximum login name length.  This is arbitrary.  */
> -#define LOGIN_NAME_MAX		256
> -
> -/* Maximum host name length.  */
> -#define HOST_NAME_MAX		64
> -
> -/* Maximum message queue priority level.  */
> -#define MQ_PRIO_MAX		32768
> -
> -/* Maximum value the semaphore can have.  */
> -#define SEM_VALUE_MAX   (2147483647)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..d7017e7b24
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
> @@ -0,0 +1,21 @@
> +/* Definition of PTHREAD_STACK_MIN.  Linux/PPC version.
> +   Copyright (C) 2021 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; see the file COPYING.LIB.  If
> +   not, see <https://www.gnu.org/licenses/>.  */
> +
> +/* Minimum size for a thread.  At least two pages for systems with 64k
> +   pages.  */
> +#define PTHREAD_STACK_MIN	131072
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h b/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
> deleted file mode 100644
> index 4a9a8c1325..0000000000
> --- a/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
> +++ /dev/null
> @@ -1,99 +0,0 @@
> -/* Minimum guaranteed maximum values for system limits.  Linux/SPARC version.
> -   Copyright (C) 1993-2021 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 Library General Public License as
> -   published by the Free Software Foundation; either version 2 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
> -   Library General Public License for more details.
> -
> -   You should have received a copy of the GNU Library General Public
> -   License along with the GNU C Library; see the file COPYING.LIB.  If
> -   not, see <https://www.gnu.org/licenses/>.  */
> -
> -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> -   and defines LINK_MAX although filesystems have different maxima.  A
> -   similar thing is true for OPEN_MAX: the limit can be changed at
> -   runtime and therefore the macro must not be defined.  Remove this
> -   after including the header if necessary.  */
> -#ifndef NR_OPEN
> -# define __undef_NR_OPEN
> -#endif
> -#ifndef LINK_MAX
> -# define __undef_LINK_MAX
> -#endif
> -#ifndef OPEN_MAX
> -# define __undef_OPEN_MAX
> -#endif
> -#ifndef ARG_MAX
> -# define __undef_ARG_MAX
> -#endif
> -
> -/* The kernel sources contain a file with all the needed information.  */
> -#include <linux/limits.h>
> -
> -/* Have to remove NR_OPEN?  */
> -#ifdef __undef_NR_OPEN
> -# undef NR_OPEN
> -# undef __undef_NR_OPEN
> -#endif
> -/* Have to remove LINK_MAX?  */
> -#ifdef __undef_LINK_MAX
> -# undef LINK_MAX
> -# undef __undef_LINK_MAX
> -#endif
> -/* Have to remove OPEN_MAX?  */
> -#ifdef __undef_OPEN_MAX
> -# undef OPEN_MAX
> -# undef __undef_OPEN_MAX
> -#endif
> -/* Have to remove ARG_MAX?  */
> -#ifdef __undef_ARG_MAX
> -# undef ARG_MAX
> -# undef __undef_ARG_MAX
> -#endif
> -
> -/* The number of data keys per process.  */
> -#define _POSIX_THREAD_KEYS_MAX	128
> -/* This is the value this implementation supports.  */
> -#define PTHREAD_KEYS_MAX	1024
> -
> -/* Controlling the iterations of destructors for thread-specific data.  */
> -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
> -/* Number of iterations this implementation does.  */
> -#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
> -
> -/* The number of threads per process.  */
> -#define _POSIX_THREAD_THREADS_MAX	64
> -/* We have no predefined limit on the number of threads.  */
> -#undef PTHREAD_THREADS_MAX
> -
> -/* Maximum amount by which a process can descrease its asynchronous I/O
> -   priority level.  */
> -#define AIO_PRIO_DELTA_MAX	20
> -
> -/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> -#define PTHREAD_STACK_MIN	24576
> -
> -/* Maximum number of timer expiration overruns.  */
> -#define DELAYTIMER_MAX	2147483647
> -
> -/* Maximum tty name length.  */
> -#define TTY_NAME_MAX		32
> -
> -/* Maximum login name length.  This is arbitrary.  */
> -#define LOGIN_NAME_MAX		256
> -
> -/* Maximum host name length.  */
> -#define HOST_NAME_MAX		64
> -
> -/* Maximum message queue priority level.  */
> -#define MQ_PRIO_MAX		32768
> -
> -/* Maximum value the semaphore can have.  */
> -#define SEM_VALUE_MAX   (2147483647)
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
> new file mode 100644
> index 0000000000..bcacedb73b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
> @@ -0,0 +1,20 @@
> +/* Definition of PTHREAD_STACK_MIN.  Linux/SPARC version.
> +   Copyright (C) 2021 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 Library General Public License as
> +   published by the Free Software Foundation; either version 2 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
> +   Library General Public License for more details.
> +
> +   You should have received a copy of the GNU Library General Public
> +   License along with the GNU C Library; see the file COPYING.LIB.  If
> +   not, see <https://www.gnu.org/licenses/>.  */
> +
> +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> +#define PTHREAD_STACK_MIN	24576
> diff --git a/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h b/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
> new file mode 100644
> index 0000000000..f2fadc8fc8
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
> @@ -0,0 +1,33 @@
> +/* sysconf_pthread_stack_min ().  Linux version.
> +   Copyright (C) 2021 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/>.  */
> +
> +/* Return sysconf (_SC_THREAD_STACK_MIN).  */
> +
> +static long int
> +sysconf_pthread_stack_min (void)

All other sysconf functions are largely __get_*

May we follow the pattern here and call this:

__get_pthread_stack_min()?

Any reason this isn't static inline?

> +{
> +  /* sysconf (_SC_THREAD_STACK_MIN) >= sysconf (_SC_MINSIGSTKSZ).  */
> +  long int pthread_stack_min = GLRO(dl_minsigstacksize);
> +  assert (pthread_stack_min != 0);
> +  _Static_assert (__builtin_constant_p (PTHREAD_STACK_MIN),
> +		  "PTHREAD_STACK_MIN is constant");
> +  /* Return MAX (PTHREAD_STACK_MIN, pthread_stack_min).  */
> +  if (pthread_stack_min < PTHREAD_STACK_MIN)
> +    pthread_stack_min = PTHREAD_STACK_MIN;

Add comment:

/* We have a private interface, __pthread_get_minstack@GLIBC_PRIVATE
   which returns a larger size that includes the required TLS variable
   space which has been determined at startup.  For sysconf here we are
   conservative and don't include the space required for TLS access.
   Eventually the TLS variable space will not be part of the stack
   (Bug 11787).  */

> +  return pthread_stack_min;
> +}
>
H.J. Lu July 9, 2021, 8:04 p.m. UTC | #2
On Fri, Jul 9, 2021 at 11:51 AM Carlos O'Donell <carlos@redhat.com> wrote:
>
> On 6/22/21 9:46 AM, H.J. Lu via Libc-alpha wrote:
> > 1. Rename _SC_SIGSTKSZ_SOURCE to _DYNAMIC_STACK_SIZE_SOURCE.
>
> This resolves Florian's comments from v2.
>
> I see Joseph's comments from v1 are also resolved.
>
> I have a few comments, but I think we're largely ready to cover
> the entire set of minimum signal and thread stack sizes.
>
> > 2. The constant PTHREAD_STACK_MIN may be too small for some processors.
> > When _DYNAMIC_STACK_SIZE_SOURCE or _GNU_SOURCE are defined, define
> > PTHREAD_STACK_MIN to sysconf(_SC_THREAD_STACK_MIN) which is changed
> > to MIN (PTHREAD_STACK_MIN, sysconf(_SC_MINSIGSTKSZ)).
> > 3. Consolidate <bits/local_lim.h> with <bits/pthread_stack_min.h> to
> > provide a target specific constant PTHREAD_STACK_MIN value.
>
> Please post a v3 and then I think we're ready.
>
> Requests:
> - Static inline?
> - Rename to match existing pattern of functions __get* in sysconf.
> - Suggest add comment about __pthread_get_minstack@GLIBC_PRIVATE

I posted the v4 patch.

> > ---
> >  NEWS                                          |   8 +-
> >  include/bits/local_lim.h                      |   7 ++
> >  include/features.h                            |  18 ++--
> >  manual/creature.texi                          |   4 +-
>
> The manual change resolves Josephs comments from v1.
>
> >  nptl/tst-context1.c                           |  15 ++-
> >  stdlib/test-atexit-race-common.c              |  11 +-
> >  support/support_path_support_time64.c         |   1 +
> >  sysdeps/posix/sysconf-pthread_stack_min.h     |  29 +++++
> >  sysdeps/posix/sysconf.c                       |   7 +-
> >  sysdeps/unix/sysv/linux/Makefile              |   3 +-
> >  .../unix/sysv/linux/aarch64/bits/local_lim.h  | 101 ------------------
> >  .../linux/aarch64/bits/pthread_stack_min.h    |  22 ++++
> >  .../unix/sysv/linux/alpha/bits/local_lim.h    |  99 -----------------
> >  .../sysv/linux/alpha/bits/pthread_stack_min.h |  20 ++++
> >  sysdeps/unix/sysv/linux/bits/local_lim.h      |   8 +-
> >  .../unix/sysv/linux/bits/pthread_stack_min.h  |  20 ++++
> >  sysdeps/unix/sysv/linux/bits/sigstksz.h       |   2 +-
> >  sysdeps/unix/sysv/linux/ia64/bits/local_lim.h |  99 -----------------
> >  .../sysv/linux/ia64/bits/pthread_stack_min.h  |  20 ++++
> >  sysdeps/unix/sysv/linux/mips/bits/local_lim.h |  99 -----------------
> >  .../sysv/linux/mips/bits/pthread_stack_min.h  |  20 ++++
> >  .../unix/sysv/linux/powerpc/bits/local_lim.h  | 100 -----------------
> >  .../linux/powerpc/bits/pthread_stack_min.h    |  21 ++++
> >  .../unix/sysv/linux/sparc/bits/local_lim.h    |  99 -----------------
> >  .../sysv/linux/sparc/bits/pthread_stack_min.h |  20 ++++
> >  .../sysv/linux/sysconf-pthread_stack_min.h    |  33 ++++++
> >  26 files changed, 260 insertions(+), 626 deletions(-)
> >  create mode 100644 include/bits/local_lim.h
> >  create mode 100644 sysdeps/posix/sysconf-pthread_stack_min.h
> >  delete mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
> >  create mode 100644 sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
> >  delete mode 100644 sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
> >  create mode 100644 sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
> >  create mode 100644 sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
> >  delete mode 100644 sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
> >  create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
> >  delete mode 100644 sysdeps/unix/sysv/linux/mips/bits/local_lim.h
> >  create mode 100644 sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
> >  delete mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
> >  create mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
> >  delete mode 100644 sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
> >  create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
> >  create mode 100644 sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
> >
> > diff --git a/NEWS b/NEWS
> > index 58cf1dab68..dc31e4bffa 100644
> > --- a/NEWS
> > +++ b/NEWS
> > @@ -9,8 +9,12 @@ Version 2.34
> >
> >  Major new features:
> >
> > -* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _SC_SIGSTKSZ_SOURCE or
> > -  _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
> > +* When _DYNAMIC_STACK_SIZE_SOURCE or _GNU_SOURCE are defined,
> > +  PTHREAD_STACK_MIN is no longer constant and is redefined to
> > +  sysconf(_SC_THREAD_STACK_MIN).
> > +
> > +* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _DYNAMIC_STACK_SIZE_SOURCE
> > +  or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
> >    constant on Linux.  MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)
> >    and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).
>
> Perfect. Both are now under _DYNAMIC_STACK_SIZE_SOURCe for signals or
> threads.
>
> >
> > diff --git a/include/bits/local_lim.h b/include/bits/local_lim.h
> > new file mode 100644
> > index 0000000000..46d82dc729
> > --- /dev/null
> > +++ b/include/bits/local_lim.h
> > @@ -0,0 +1,7 @@
> > +/* Don't define PTHREAD_STACK_MIN to sysconf (_SC_THREAD_STACK_MIN) for
> > +   glibc build.  */
> > +#if !defined _ISOMAC
> > +# undef __USE_DYNAMIC_STACK_SIZE
> > +#endif
> > +
> > +#include_next <bits/local_lim.h>
> > diff --git a/include/features.h b/include/features.h
> > index 039bcb112b..51c8a98fb0 100644
> > --- a/include/features.h
> > +++ b/include/features.h
> > @@ -50,8 +50,8 @@
> >     _LARGEFILE64_SOURCE       Additional functionality from LFS for large files.
> >     _FILE_OFFSET_BITS=N       Select default filesystem interface.
> >     _ATFILE_SOURCE    Additional *at interfaces.
> > -   _SC_SIGSTKSZ_SOURCE       Select correct (but non compile-time constant)
> > -                     MINSIGSTKSZ and SIGSTKSZ.
> > +   _DYNAMIC_STACK_SIZE_SOURCE Select correct (but non compile-time constant)
> > +                     MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN.
> >     _GNU_SOURCE               All of the above, plus GNU extensions.
> >     _DEFAULT_SOURCE   The default set of features (taking precedence over
> >                       __STRICT_ANSI__).
> > @@ -98,8 +98,8 @@
> >     __USE_FILE_OFFSET64       Define 64bit interface as default.
> >     __USE_MISC                Define things from 4.3BSD or System V Unix.
> >     __USE_ATFILE              Define *at interfaces and AT_* constants for them.
> > -   __USE_SC_SIGSTKSZ Define correct (but non compile-time constant)
> > -                     MINSIGSTKSZ and SIGSTKSZ.
> > +   __USE_DYNAMIC_STACK_SIZE Define correct (but non compile-time constant)
> > +                     MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN.
> >     __USE_GNU         Define GNU extensions.
> >     __USE_FORTIFY_LEVEL       Additional security measures used, according to level.
> >
> > @@ -143,7 +143,7 @@
> >  #undef       __USE_FILE_OFFSET64
> >  #undef       __USE_MISC
> >  #undef       __USE_ATFILE
> > -#undef       __USE_SC_SIGSTKSZ
> > +#undef       __USE_DYNAMIC_STACK_SIZE
>
> OK.
>
> >  #undef       __USE_GNU
> >  #undef       __USE_FORTIFY_LEVEL
> >  #undef       __KERNEL_STRICT_NAMES
> > @@ -220,8 +220,8 @@
> >  # define _DEFAULT_SOURCE     1
> >  # undef  _ATFILE_SOURCE
> >  # define _ATFILE_SOURCE      1
> > -# undef  _SC_SIGSTKSZ_SOURCE
> > -# define _SC_SIGSTKSZ_SOURCE 1
> > +# undef  _DYNAMIC_STACK_SIZE_SOURCE
> > +# define _DYNAMIC_STACK_SIZE_SOURCE 1
> >  #endif
> >
> >  /* If nothing (other than _GNU_SOURCE and _DEFAULT_SOURCE) is defined,
> > @@ -399,8 +399,8 @@
> >  # define __USE_ATFILE        1
> >  #endif
> >
> > -#ifdef       _SC_SIGSTKSZ_SOURCE
> > -# define __USE_SC_SIGSTKSZ   1
> > +#ifdef       _DYNAMIC_STACK_SIZE_SOURCE
> > +# define __USE_DYNAMIC_STACK_SIZE    1
> >  #endif
> >
> >  #ifdef       _GNU_SOURCE
> > diff --git a/manual/creature.texi b/manual/creature.texi
> > index 9fa658e9a7..fdd16f49cf 100644
> > --- a/manual/creature.texi
> > +++ b/manual/creature.texi
> > @@ -309,10 +309,10 @@ checks are applied. If defined to @math{3}, @theglibc{} may also use
> >  checks that may have an additional performance overhead.
> >  @end defvr
> >
> > -@defvr Macro _SC_SIGSTKSZ_SOURCE
> > +@defvr Macro _DYNAMIC_STACK_SIZE_SOURCE
>
> OK. Resolves Joseph's comments.
>
> >  @standards{GNU, (none)}
> >  If this macro is defined, correct (but non compile-time constant)
> > -MINSIGSTKSZ and SIGSTKSZ are defined.
> > +MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN are defined.
> >  @end defvr
> >
> >  @defvr Macro _REENTRANT
> > diff --git a/nptl/tst-context1.c b/nptl/tst-context1.c
> > index 821f3c2133..00e39aff9f 100644
> > --- a/nptl/tst-context1.c
> > +++ b/nptl/tst-context1.c
> > @@ -23,6 +23,7 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <ucontext.h>
> > +#include <support/support.h>
> >
> >  #define N    4
> >  #if __WORDSIZE == 64
> > @@ -36,7 +37,8 @@ typedef struct {
> >         unsigned long guard[3];
> >     } tst_context_t;
> >
> > -static char stacks[N][2 * PTHREAD_STACK_MIN];
> > +static char *stacks[N];
> > +static size_t stack_size;
> >  static tst_context_t ctx[N][2];
> >  static volatile int failures;
> >
> > @@ -79,7 +81,7 @@ fct (long int n)
> >        exit (1);
> >      }
> >
> > -  if (on_stack < stacks[n] || on_stack >= stacks[n] + sizeof (stacks[0]))
> > +  if (on_stack < stacks[n] || on_stack >= stacks[n] + stack_size)
> >      {
> >        printf ("%ld: on_stack not on appropriate stack\n", n);
> >        exit (1);
> > @@ -109,7 +111,7 @@ tf (void *arg)
> >    printf ("%d: %s: before makecontext\n", n, __FUNCTION__);
> >
> >    ctx[n][1].uctx.uc_stack.ss_sp = stacks[n];
> > -  ctx[n][1].uctx.uc_stack.ss_size = sizeof (stacks[n]);
> > +  ctx[n][1].uctx.uc_stack.ss_size = stack_size;
> >    ctx[n][1].uctx.uc_link = &ctx[n][0].uctx;
> >    makecontext (&ctx[n][1].uctx, (void (*) (void)) fct, 1, (long int) n);
> >
> > @@ -137,6 +139,10 @@ do_test (void)
> >    pthread_t th[N];
> >    ucontext_t mctx;
> >
> > +  stack_size = 2 * PTHREAD_STACK_MIN;
> > +  for (int i = 0; i < N; i++)
> > +    stacks[i] = xmalloc (stack_size);
> > +
> >    puts ("making contexts");
> >    if (getcontext (&mctx) != 0)
> >      {
> > @@ -198,6 +204,9 @@ do_test (void)
> >       exit (1);
> >        }
> >
> > +  for (int i = 0; i < N; i++)
> > +    free (stacks[i]);
> > +
> >    return failures;
> >  }
> >
> > diff --git a/stdlib/test-atexit-race-common.c b/stdlib/test-atexit-race-common.c
> > index a2b5468580..b48bb16285 100644
> > --- a/stdlib/test-atexit-race-common.c
> > +++ b/stdlib/test-atexit-race-common.c
> > @@ -38,11 +38,6 @@
> >
> >  const size_t kNumThreads = 1024;
> >  const size_t kNumHandlers = 1024;
> > -const size_t kStacksize =
> > -#ifdef PTHREAD_STACK_MIN
> > -     0x20000 < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN :
> > -#endif
> > -             0x20000;
> >
> >  static void *
> >  threadfunc (void *unused)
> > @@ -66,6 +61,12 @@ do_test (void)
> >    /* With default 8MiB Linux stack size, creating 1024 threads can cause
> >       VM exhausiton on 32-bit machines.  Reduce stack size of each thread to
> >       128KiB for a maximum required VM size of 128MiB.  */
> > +  size_t kStacksize =
> > +#ifdef PTHREAD_STACK_MIN
> > +    0x20000 < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN :
> > +#endif
> > +    0x20000;
> > +
> >    xpthread_attr_setstacksize (&attr, kStacksize);
> >
> >    for (i = 0; i < kNumThreads; ++i) {
> > diff --git a/support/support_path_support_time64.c b/support/support_path_support_time64.c
> > index 33b2bdff66..619a4eab00 100644
> > --- a/support/support_path_support_time64.c
> > +++ b/support/support_path_support_time64.c
> > @@ -17,6 +17,7 @@
> >     <https://www.gnu.org/licenses/>.  */
> >
> >  #include <fcntl.h>
> > +#include <unistd.h>
> >  #include <support/check.h>
> >  #include <support/support.h>
> >  #include <sys/stat.h>
> > diff --git a/sysdeps/posix/sysconf-pthread_stack_min.h b/sysdeps/posix/sysconf-pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..4b1dabc79a
> > --- /dev/null
> > +++ b/sysdeps/posix/sysconf-pthread_stack_min.h
> > @@ -0,0 +1,29 @@
> > +/* sysconf_pthread_stack_min ().  POSIX version.
> > +   Copyright (C) 2021 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/>.  */
> > +
> > +/* Return sysconf (_SC_THREAD_STACK_MIN).  */
> > +
> > +static long int
> > +sysconf_pthread_stack_min (void)
>
> Static inline?

Fixed.

> __get_pthread_stack_min? To follow the design pattern of __get* functions.

Fixed.

> > +{
> > +#ifdef       PTHREAD_STACK_MIN
> > +      return PTHREAD_STACK_MIN;
> > +#else
> > +      return -1;
> > +#endif
> > +}
> > diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c
> > index 54d6046d00..c505995cc1 100644
> > --- a/sysdeps/posix/sysconf.c
> > +++ b/sysdeps/posix/sysconf.c
> > @@ -31,6 +31,7 @@
> >  #include <sys/types.h>
> >  #include <sys/uio.h>
> >  #include <regex.h>
> > +#include <sysconf-pthread_stack_min.h>
> >
> >  #define NEED_SPEC_ARRAY 0
> >  #include <posix-conf-vars.h>
> > @@ -569,11 +570,7 @@ __sysconf (int name)
> >  #endif
> >
> >      case _SC_THREAD_STACK_MIN:
> > -#ifdef       PTHREAD_STACK_MIN
> > -      return PTHREAD_STACK_MIN;
> > -#else
> > -      return -1;
> > -#endif
> > +      return sysconf_pthread_stack_min ();
> >
> >      case _SC_THREAD_THREADS_MAX:
> >  #ifdef       PTHREAD_THREADS_MAX
> > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> > index 294c366e3b..4613f7263f 100644
> > --- a/sysdeps/unix/sysv/linux/Makefile
> > +++ b/sysdeps/unix/sysv/linux/Makefile
> > @@ -107,7 +107,8 @@ sysdep_headers += sys/mount.h sys/acct.h \
> >                 bits/types/struct_semid64_ds.h \
> >                 bits/types/struct_semid64_ds_helper.h \
> >                 bits/types/struct_shmid64_ds.h \
> > -               bits/types/struct_shmid64_ds_helper.h
> > +               bits/types/struct_shmid64_ds_helper.h \
> > +               bits/pthread_stack_min.h
> >
> >  tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
> >        tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
> > diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h b/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
> > deleted file mode 100644
> > index 0652bf4a06..0000000000
> > --- a/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
> > +++ /dev/null
> > @@ -1,101 +0,0 @@
> > -/* Minimum guaranteed maximum values for system limits.  Linux version.
> > -   Copyright (C) 1993-2021 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/>.  */
> > -
> > -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> > -   and defines LINK_MAX although filesystems have different maxima.  A
> > -   similar thing is true for OPEN_MAX: the limit can be changed at
> > -   runtime and therefore the macro must not be defined.  Remove this
> > -   after including the header if necessary.  */
> > -#ifndef NR_OPEN
> > -# define __undef_NR_OPEN
> > -#endif
> > -#ifndef LINK_MAX
> > -# define __undef_LINK_MAX
> > -#endif
> > -#ifndef OPEN_MAX
> > -# define __undef_OPEN_MAX
> > -#endif
> > -#ifndef ARG_MAX
> > -# define __undef_ARG_MAX
> > -#endif
> > -
> > -/* The kernel sources contain a file with all the needed information.  */
> > -#include <linux/limits.h>
> > -
> > -/* Have to remove NR_OPEN?  */
> > -#ifdef __undef_NR_OPEN
> > -# undef NR_OPEN
> > -# undef __undef_NR_OPEN
> > -#endif
> > -/* Have to remove LINK_MAX?  */
> > -#ifdef __undef_LINK_MAX
> > -# undef LINK_MAX
> > -# undef __undef_LINK_MAX
> > -#endif
> > -/* Have to remove OPEN_MAX?  */
> > -#ifdef __undef_OPEN_MAX
> > -# undef OPEN_MAX
> > -# undef __undef_OPEN_MAX
> > -#endif
> > -/* Have to remove ARG_MAX?  */
> > -#ifdef __undef_ARG_MAX
> > -# undef ARG_MAX
> > -# undef __undef_ARG_MAX
> > -#endif
> > -
> > -/* The number of data keys per process.  */
> > -#define _POSIX_THREAD_KEYS_MAX       128
> > -/* This is the value this implementation supports.  */
> > -#define PTHREAD_KEYS_MAX     1024
> > -
> > -/* Controlling the iterations of destructors for thread-specific data.  */
> > -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
> > -/* Number of iterations this implementation does.  */
> > -#define PTHREAD_DESTRUCTOR_ITERATIONS        _POSIX_THREAD_DESTRUCTOR_ITERATIONS
> > -
> > -/* The number of threads per process.  */
> > -#define _POSIX_THREAD_THREADS_MAX    64
> > -/* We have no predefined limit on the number of threads.  */
> > -#undef PTHREAD_THREADS_MAX
> > -
> > -/* Maximum amount by which a process can descrease its asynchronous I/O
> > -   priority level.  */
> > -#define AIO_PRIO_DELTA_MAX   20
> > -
> > -/* Minimum size for a thread.  At least two pages for systems with 64k
> > -   pages.  */
> > -#define PTHREAD_STACK_MIN    131072
> > -
> > -/* Maximum number of timer expiration overruns.  */
> > -#define DELAYTIMER_MAX       2147483647
> > -
> > -/* Maximum tty name length.  */
> > -#define TTY_NAME_MAX         32
> > -
> > -/* Maximum login name length.  This is arbitrary.  */
> > -#define LOGIN_NAME_MAX               256
> > -
> > -/* Maximum host name length.  */
> > -#define HOST_NAME_MAX                64
> > -
> > -/* Maximum message queue priority level.  */
> > -#define MQ_PRIO_MAX          32768
> > -
> > -/* Maximum value the semaphore can have.  */
> > -#define SEM_VALUE_MAX   (2147483647)
> > diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..97215687ad
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
> > @@ -0,0 +1,22 @@
> > +/* Definition of PTHREAD_STACK_MIN.  Linux/aarch64 version.
> > +   Copyright (C) 2021 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/>.  */
> > +
> > +/* Minimum size for a thread.  At least two pages for systems with 64k
> > +   pages.  */
> > +#define PTHREAD_STACK_MIN    131072
> > diff --git a/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h b/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
> > deleted file mode 100644
> > index 523407dc48..0000000000
> > --- a/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
> > +++ /dev/null
> > @@ -1,99 +0,0 @@
> > -/* Minimum guaranteed maximum values for system limits.  Linux/Alpha version.
> > -   Copyright (C) 1993-2021 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 Library General Public License as
> > -   published by the Free Software Foundation; either version 2 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
> > -   Library General Public License for more details.
> > -
> > -   You should have received a copy of the GNU Library General Public
> > -   License along with the GNU C Library.  If not, see
> > -   <https://www.gnu.org/licenses/>.  */
> > -
> > -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> > -   and defines LINK_MAX although filesystems have different maxima.  A
> > -   similar thing is true for OPEN_MAX: the limit can be changed at
> > -   runtime and therefore the macro must not be defined.  Remove this
> > -   after including the header if necessary.  */
> > -#ifndef NR_OPEN
> > -# define __undef_NR_OPEN
> > -#endif
> > -#ifndef LINK_MAX
> > -# define __undef_LINK_MAX
> > -#endif
> > -#ifndef OPEN_MAX
> > -# define __undef_OPEN_MAX
> > -#endif
> > -#ifndef ARG_MAX
> > -# define __undef_ARG_MAX
> > -#endif
> > -
> > -/* The kernel sources contain a file with all the needed information.  */
> > -#include <linux/limits.h>
> > -
> > -/* Have to remove NR_OPEN?  */
> > -#ifdef __undef_NR_OPEN
> > -# undef NR_OPEN
> > -# undef __undef_NR_OPEN
> > -#endif
> > -/* Have to remove LINK_MAX?  */
> > -#ifdef __undef_LINK_MAX
> > -# undef LINK_MAX
> > -# undef __undef_LINK_MAX
> > -#endif
> > -/* Have to remove OPEN_MAX?  */
> > -#ifdef __undef_OPEN_MAX
> > -# undef OPEN_MAX
> > -# undef __undef_OPEN_MAX
> > -#endif
> > -/* Have to remove ARG_MAX?  */
> > -#ifdef __undef_ARG_MAX
> > -# undef ARG_MAX
> > -# undef __undef_ARG_MAX
> > -#endif
> > -
> > -/* The number of data keys per process.  */
> > -#define _POSIX_THREAD_KEYS_MAX       128
> > -/* This is the value this implementation supports.  */
> > -#define PTHREAD_KEYS_MAX     1024
> > -
> > -/* Controlling the iterations of destructors for thread-specific data.  */
> > -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
> > -/* Number of iterations this implementation does.  */
> > -#define PTHREAD_DESTRUCTOR_ITERATIONS        _POSIX_THREAD_DESTRUCTOR_ITERATIONS
> > -
> > -/* The number of threads per process.  */
> > -#define _POSIX_THREAD_THREADS_MAX    64
> > -/* We have no predefined limit on the number of threads.  */
> > -#undef PTHREAD_THREADS_MAX
> > -
> > -/* Maximum amount by which a process can descrease its asynchronous I/O
> > -   priority level.  */
> > -#define AIO_PRIO_DELTA_MAX   20
> > -
> > -/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > -#define PTHREAD_STACK_MIN    24576
> > -
> > -/* Maximum number of timer expiration overruns.  */
> > -#define DELAYTIMER_MAX       2147483647
> > -
> > -/* Maximum tty name length.  */
> > -#define TTY_NAME_MAX         32
> > -
> > -/* Maximum login name length.  This is arbitrary.  */
> > -#define LOGIN_NAME_MAX               256
> > -
> > -/* Maximum host name length.  */
> > -#define HOST_NAME_MAX                64
> > -
> > -/* Maximum message queue priority level.  */
> > -#define MQ_PRIO_MAX          32768
> > -
> > -/* Maximum value the semaphore can have.  */
> > -#define SEM_VALUE_MAX   (2147483647)
> > diff --git a/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..5bfb0e10dd
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
> > @@ -0,0 +1,20 @@
> > +/* Definition of PTHREAD_STACK_MIN.  Linux/Alpha version.
> > +   Copyright (C) 2021 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 Library General Public License as
> > +   published by the Free Software Foundation; either version 2 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
> > +   Library General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Library General Public
> > +   License along with the GNU C Library.  If not, see
> > +   <https://www.gnu.org/licenses/>.  */
> > +
> > +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > +#define PTHREAD_STACK_MIN    24576
> > diff --git a/sysdeps/unix/sysv/linux/bits/local_lim.h b/sysdeps/unix/sysv/linux/bits/local_lim.h
> > index b88ca3d4d2..0b1c7f40be 100644
> > --- a/sysdeps/unix/sysv/linux/bits/local_lim.h
> > +++ b/sysdeps/unix/sysv/linux/bits/local_lim.h
> > @@ -78,7 +78,13 @@
> >  #define AIO_PRIO_DELTA_MAX   20
> >
> >  /* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > -#define PTHREAD_STACK_MIN    16384
> > +#undef PTHREAD_STACK_MIN
> > +#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE
> > +# include <unistd.h>
> > +# define PTHREAD_STACK_MIN   sysconf (_SC_THREAD_STACK_MIN)
> > +#else
> > +# include <bits/pthread_stack_min.h>
> > +#endif
> >
> >  /* Maximum number of timer expiration overruns.  */
> >  #define DELAYTIMER_MAX       2147483647
> > diff --git a/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..7bd6fa1242
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
> > @@ -0,0 +1,20 @@
> > +/* Definition of PTHREAD_STACK_MIN.  Linux version.
> > +   Copyright (C) 2021 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/>.  */
> > +
> > +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > +#define PTHREAD_STACK_MIN    16384
> > diff --git a/sysdeps/unix/sysv/linux/bits/sigstksz.h b/sysdeps/unix/sysv/linux/bits/sigstksz.h
> > index 926508f2b4..cd45d122e0 100644
> > --- a/sysdeps/unix/sysv/linux/bits/sigstksz.h
> > +++ b/sysdeps/unix/sysv/linux/bits/sigstksz.h
> > @@ -20,7 +20,7 @@
> >  # error "Never include <bits/sigstksz.h> directly; use <signal.h> instead."
> >  #endif
> >
> > -#if defined __USE_SC_SIGSTKSZ && __USE_SC_SIGSTKSZ
> > +#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE
> >  # include <unistd.h>
> >
> >  /* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */
> > diff --git a/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h b/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
> > deleted file mode 100644
> > index 7a9f677ec8..0000000000
> > --- a/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
> > +++ /dev/null
> > @@ -1,99 +0,0 @@
> > -/* Minimum guaranteed maximum values for system limits.  Linux/IA-64 version.
> > -   Copyright (C) 1993-2021 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/>.  */
> > -
> > -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> > -   and defines LINK_MAX although filesystems have different maxima.  A
> > -   similar thing is true for OPEN_MAX: the limit can be changed at
> > -   runtime and therefore the macro must not be defined.  Remove this
> > -   after including the header if necessary.  */
> > -#ifndef NR_OPEN
> > -# define __undef_NR_OPEN
> > -#endif
> > -#ifndef LINK_MAX
> > -# define __undef_LINK_MAX
> > -#endif
> > -#ifndef OPEN_MAX
> > -# define __undef_OPEN_MAX
> > -#endif
> > -#ifndef ARG_MAX
> > -# define __undef_ARG_MAX
> > -#endif
> > -
> > -/* The kernel sources contain a file with all the needed information.  */
> > -#include <linux/limits.h>
> > -
> > -/* Have to remove NR_OPEN?  */
> > -#ifdef __undef_NR_OPEN
> > -# undef NR_OPEN
> > -# undef __undef_NR_OPEN
> > -#endif
> > -/* Have to remove LINK_MAX?  */
> > -#ifdef __undef_LINK_MAX
> > -# undef LINK_MAX
> > -# undef __undef_LINK_MAX
> > -#endif
> > -/* Have to remove OPEN_MAX?  */
> > -#ifdef __undef_OPEN_MAX
> > -# undef OPEN_MAX
> > -# undef __undef_OPEN_MAX
> > -#endif
> > -/* Have to remove ARG_MAX?  */
> > -#ifdef __undef_ARG_MAX
> > -# undef ARG_MAX
> > -# undef __undef_ARG_MAX
> > -#endif
> > -
> > -/* The number of data keys per process.  */
> > -#define _POSIX_THREAD_KEYS_MAX       128
> > -/* This is the value this implementation supports.  */
> > -#define PTHREAD_KEYS_MAX     1024
> > -
> > -/* Controlling the iterations of destructors for thread-specific data.  */
> > -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
> > -/* Number of iterations this implementation does.  */
> > -#define PTHREAD_DESTRUCTOR_ITERATIONS        _POSIX_THREAD_DESTRUCTOR_ITERATIONS
> > -
> > -/* The number of threads per process.  */
> > -#define _POSIX_THREAD_THREADS_MAX    64
> > -/* We have no predefined limit on the number of threads.  */
> > -#undef PTHREAD_THREADS_MAX
> > -
> > -/* Maximum amount by which a process can descrease its asynchronous I/O
> > -   priority level.  */
> > -#define AIO_PRIO_DELTA_MAX   20
> > -
> > -/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > -#define PTHREAD_STACK_MIN    196608
> > -
> > -/* Maximum number of timer expiration overruns.  */
> > -#define DELAYTIMER_MAX       2147483647
> > -
> > -/* Maximum tty name length.  */
> > -#define TTY_NAME_MAX         32
> > -
> > -/* Maximum login name length.  This is arbitrary.  */
> > -#define LOGIN_NAME_MAX               256
> > -
> > -/* Maximum host name length.  */
> > -#define HOST_NAME_MAX                64
> > -
> > -/* Maximum message queue priority level.  */
> > -#define MQ_PRIO_MAX          32768
> > -
> > -/* Maximum value the semaphore can have.  */
> > -#define SEM_VALUE_MAX   (2147483647)
> > diff --git a/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..73581506b2
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
> > @@ -0,0 +1,20 @@
> > +/* Definition of PTHREAD_STACK_MIN.  Linux/IA-64 version.
> > +   Copyright (C) 2021 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/>.  */
> > +
> > +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > +#define PTHREAD_STACK_MIN    196608
> > diff --git a/sysdeps/unix/sysv/linux/mips/bits/local_lim.h b/sysdeps/unix/sysv/linux/mips/bits/local_lim.h
> > deleted file mode 100644
> > index a6a0d8a980..0000000000
> > --- a/sysdeps/unix/sysv/linux/mips/bits/local_lim.h
> > +++ /dev/null
> > @@ -1,99 +0,0 @@
> > -/* Minimum guaranteed maximum values for system limits.  MIPS Linux version.
> > -   Copyright (C) 1993-2021 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/>.  */
> > -
> > -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> > -   and defines LINK_MAX although filesystems have different maxima.  A
> > -   similar thing is true for OPEN_MAX: the limit can be changed at
> > -   runtime and therefore the macro must not be defined.  Remove this
> > -   after including the header if necessary.  */
> > -#ifndef NR_OPEN
> > -# define __undef_NR_OPEN
> > -#endif
> > -#ifndef LINK_MAX
> > -# define __undef_LINK_MAX
> > -#endif
> > -#ifndef OPEN_MAX
> > -# define __undef_OPEN_MAX
> > -#endif
> > -#ifndef ARG_MAX
> > -# define __undef_ARG_MAX
> > -#endif
> > -
> > -/* The kernel sources contain a file with all the needed information.  */
> > -#include <linux/limits.h>
> > -
> > -/* Have to remove NR_OPEN?  */
> > -#ifdef __undef_NR_OPEN
> > -# undef NR_OPEN
> > -# undef __undef_NR_OPEN
> > -#endif
> > -/* Have to remove LINK_MAX?  */
> > -#ifdef __undef_LINK_MAX
> > -# undef LINK_MAX
> > -# undef __undef_LINK_MAX
> > -#endif
> > -/* Have to remove OPEN_MAX?  */
> > -#ifdef __undef_OPEN_MAX
> > -# undef OPEN_MAX
> > -# undef __undef_OPEN_MAX
> > -#endif
> > -/* Have to remove ARG_MAX?  */
> > -#ifdef __undef_ARG_MAX
> > -# undef ARG_MAX
> > -# undef __undef_ARG_MAX
> > -#endif
> > -
> > -/* The number of data keys per process.  */
> > -#define _POSIX_THREAD_KEYS_MAX       128
> > -/* This is the value this implementation supports.  */
> > -#define PTHREAD_KEYS_MAX     1024
> > -
> > -/* Controlling the iterations of destructors for thread-specific data.  */
> > -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
> > -/* Number of iterations this implementation does.  */
> > -#define PTHREAD_DESTRUCTOR_ITERATIONS        _POSIX_THREAD_DESTRUCTOR_ITERATIONS
> > -
> > -/* The number of threads per process.  */
> > -#define _POSIX_THREAD_THREADS_MAX    64
> > -/* We have no predefined limit on the number of threads.  */
> > -#undef PTHREAD_THREADS_MAX
> > -
> > -/* Maximum amount by which a process can descrease its asynchronous I/O
> > -   priority level.  */
> > -#define AIO_PRIO_DELTA_MAX   20
> > -
> > -/* Minimum size for a thread.  At least two pages with 64k pages.  */
> > -#define PTHREAD_STACK_MIN    131072
> > -
> > -/* Maximum number of timer expiration overruns.  */
> > -#define DELAYTIMER_MAX       2147483647
> > -
> > -/* Maximum tty name length.  */
> > -#define TTY_NAME_MAX         32
> > -
> > -/* Maximum login name length.  This is arbitrary.  */
> > -#define LOGIN_NAME_MAX               256
> > -
> > -/* Maximum host name length.  */
> > -#define HOST_NAME_MAX                64
> > -
> > -/* Maximum message queue priority level.  */
> > -#define MQ_PRIO_MAX          32768
> > -
> > -/* Maximum value the semaphore can have.  */
> > -#define SEM_VALUE_MAX   (2147483647)
> > diff --git a/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..132f1704a5
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
> > @@ -0,0 +1,20 @@
> > +/* Definition of PTHREAD_STACK_MIN.  MIPS Linux version.
> > +   Copyright (C) 2021 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/>.  */
> > +
> > +/* Minimum size for a thread.  At least two pages with 64k pages.  */
> > +#define PTHREAD_STACK_MIN    131072
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h b/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
> > deleted file mode 100644
> > index 6caa627506..0000000000
> > --- a/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
> > +++ /dev/null
> > @@ -1,100 +0,0 @@
> > -/* Minimum guaranteed maximum values for system limits.  Linux/PPC version.
> > -   Copyright (C) 1993-2021 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; see the file COPYING.LIB.  If
> > -   not, see <https://www.gnu.org/licenses/>.  */
> > -
> > -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> > -   and defines LINK_MAX although filesystems have different maxima.  A
> > -   similar thing is true for OPEN_MAX: the limit can be changed at
> > -   runtime and therefore the macro must not be defined.  Remove this
> > -   after including the header if necessary.  */
> > -#ifndef NR_OPEN
> > -# define __undef_NR_OPEN
> > -#endif
> > -#ifndef LINK_MAX
> > -# define __undef_LINK_MAX
> > -#endif
> > -#ifndef OPEN_MAX
> > -# define __undef_OPEN_MAX
> > -#endif
> > -#ifndef ARG_MAX
> > -# define __undef_ARG_MAX
> > -#endif
> > -
> > -/* The kernel sources contain a file with all the needed information.  */
> > -#include <linux/limits.h>
> > -
> > -/* Have to remove NR_OPEN?  */
> > -#ifdef __undef_NR_OPEN
> > -# undef NR_OPEN
> > -# undef __undef_NR_OPEN
> > -#endif
> > -/* Have to remove LINK_MAX?  */
> > -#ifdef __undef_LINK_MAX
> > -# undef LINK_MAX
> > -# undef __undef_LINK_MAX
> > -#endif
> > -/* Have to remove OPEN_MAX?  */
> > -#ifdef __undef_OPEN_MAX
> > -# undef OPEN_MAX
> > -# undef __undef_OPEN_MAX
> > -#endif
> > -/* Have to remove ARG_MAX?  */
> > -#ifdef __undef_ARG_MAX
> > -# undef ARG_MAX
> > -# undef __undef_ARG_MAX
> > -#endif
> > -
> > -/* The number of data keys per process.  */
> > -#define _POSIX_THREAD_KEYS_MAX       128
> > -/* This is the value this implementation supports.  */
> > -#define PTHREAD_KEYS_MAX     1024
> > -
> > -/* Controlling the iterations of destructors for thread-specific data.  */
> > -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
> > -/* Number of iterations this implementation does.  */
> > -#define PTHREAD_DESTRUCTOR_ITERATIONS        _POSIX_THREAD_DESTRUCTOR_ITERATIONS
> > -
> > -/* The number of threads per process.  */
> > -#define _POSIX_THREAD_THREADS_MAX    64
> > -/* We have no predefined limit on the number of threads.  */
> > -#undef PTHREAD_THREADS_MAX
> > -
> > -/* Maximum amount by which a process can descrease its asynchronous I/O
> > -   priority level.  */
> > -#define AIO_PRIO_DELTA_MAX   20
> > -
> > -/* Minimum size for a thread.  At least two pages for systems with 64k
> > -   pages.  */
> > -#define PTHREAD_STACK_MIN    131072
> > -
> > -/* Maximum number of timer expiration overruns.  */
> > -#define DELAYTIMER_MAX       2147483647
> > -
> > -/* Maximum tty name length.  */
> > -#define TTY_NAME_MAX         32
> > -
> > -/* Maximum login name length.  This is arbitrary.  */
> > -#define LOGIN_NAME_MAX               256
> > -
> > -/* Maximum host name length.  */
> > -#define HOST_NAME_MAX                64
> > -
> > -/* Maximum message queue priority level.  */
> > -#define MQ_PRIO_MAX          32768
> > -
> > -/* Maximum value the semaphore can have.  */
> > -#define SEM_VALUE_MAX   (2147483647)
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..d7017e7b24
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
> > @@ -0,0 +1,21 @@
> > +/* Definition of PTHREAD_STACK_MIN.  Linux/PPC version.
> > +   Copyright (C) 2021 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; see the file COPYING.LIB.  If
> > +   not, see <https://www.gnu.org/licenses/>.  */
> > +
> > +/* Minimum size for a thread.  At least two pages for systems with 64k
> > +   pages.  */
> > +#define PTHREAD_STACK_MIN    131072
> > diff --git a/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h b/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
> > deleted file mode 100644
> > index 4a9a8c1325..0000000000
> > --- a/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
> > +++ /dev/null
> > @@ -1,99 +0,0 @@
> > -/* Minimum guaranteed maximum values for system limits.  Linux/SPARC version.
> > -   Copyright (C) 1993-2021 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 Library General Public License as
> > -   published by the Free Software Foundation; either version 2 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
> > -   Library General Public License for more details.
> > -
> > -   You should have received a copy of the GNU Library General Public
> > -   License along with the GNU C Library; see the file COPYING.LIB.  If
> > -   not, see <https://www.gnu.org/licenses/>.  */
> > -
> > -/* The kernel header pollutes the namespace with the NR_OPEN symbol
> > -   and defines LINK_MAX although filesystems have different maxima.  A
> > -   similar thing is true for OPEN_MAX: the limit can be changed at
> > -   runtime and therefore the macro must not be defined.  Remove this
> > -   after including the header if necessary.  */
> > -#ifndef NR_OPEN
> > -# define __undef_NR_OPEN
> > -#endif
> > -#ifndef LINK_MAX
> > -# define __undef_LINK_MAX
> > -#endif
> > -#ifndef OPEN_MAX
> > -# define __undef_OPEN_MAX
> > -#endif
> > -#ifndef ARG_MAX
> > -# define __undef_ARG_MAX
> > -#endif
> > -
> > -/* The kernel sources contain a file with all the needed information.  */
> > -#include <linux/limits.h>
> > -
> > -/* Have to remove NR_OPEN?  */
> > -#ifdef __undef_NR_OPEN
> > -# undef NR_OPEN
> > -# undef __undef_NR_OPEN
> > -#endif
> > -/* Have to remove LINK_MAX?  */
> > -#ifdef __undef_LINK_MAX
> > -# undef LINK_MAX
> > -# undef __undef_LINK_MAX
> > -#endif
> > -/* Have to remove OPEN_MAX?  */
> > -#ifdef __undef_OPEN_MAX
> > -# undef OPEN_MAX
> > -# undef __undef_OPEN_MAX
> > -#endif
> > -/* Have to remove ARG_MAX?  */
> > -#ifdef __undef_ARG_MAX
> > -# undef ARG_MAX
> > -# undef __undef_ARG_MAX
> > -#endif
> > -
> > -/* The number of data keys per process.  */
> > -#define _POSIX_THREAD_KEYS_MAX       128
> > -/* This is the value this implementation supports.  */
> > -#define PTHREAD_KEYS_MAX     1024
> > -
> > -/* Controlling the iterations of destructors for thread-specific data.  */
> > -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
> > -/* Number of iterations this implementation does.  */
> > -#define PTHREAD_DESTRUCTOR_ITERATIONS        _POSIX_THREAD_DESTRUCTOR_ITERATIONS
> > -
> > -/* The number of threads per process.  */
> > -#define _POSIX_THREAD_THREADS_MAX    64
> > -/* We have no predefined limit on the number of threads.  */
> > -#undef PTHREAD_THREADS_MAX
> > -
> > -/* Maximum amount by which a process can descrease its asynchronous I/O
> > -   priority level.  */
> > -#define AIO_PRIO_DELTA_MAX   20
> > -
> > -/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > -#define PTHREAD_STACK_MIN    24576
> > -
> > -/* Maximum number of timer expiration overruns.  */
> > -#define DELAYTIMER_MAX       2147483647
> > -
> > -/* Maximum tty name length.  */
> > -#define TTY_NAME_MAX         32
> > -
> > -/* Maximum login name length.  This is arbitrary.  */
> > -#define LOGIN_NAME_MAX               256
> > -
> > -/* Maximum host name length.  */
> > -#define HOST_NAME_MAX                64
> > -
> > -/* Maximum message queue priority level.  */
> > -#define MQ_PRIO_MAX          32768
> > -
> > -/* Maximum value the semaphore can have.  */
> > -#define SEM_VALUE_MAX   (2147483647)
> > diff --git a/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..bcacedb73b
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
> > @@ -0,0 +1,20 @@
> > +/* Definition of PTHREAD_STACK_MIN.  Linux/SPARC version.
> > +   Copyright (C) 2021 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 Library General Public License as
> > +   published by the Free Software Foundation; either version 2 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
> > +   Library General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Library General Public
> > +   License along with the GNU C Library; see the file COPYING.LIB.  If
> > +   not, see <https://www.gnu.org/licenses/>.  */
> > +
> > +/* Minimum size for a thread.  We are free to choose a reasonable value.  */
> > +#define PTHREAD_STACK_MIN    24576
> > diff --git a/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h b/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
> > new file mode 100644
> > index 0000000000..f2fadc8fc8
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
> > @@ -0,0 +1,33 @@
> > +/* sysconf_pthread_stack_min ().  Linux version.
> > +   Copyright (C) 2021 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/>.  */
> > +
> > +/* Return sysconf (_SC_THREAD_STACK_MIN).  */
> > +
> > +static long int
> > +sysconf_pthread_stack_min (void)
>
> All other sysconf functions are largely __get_*

Fixed.

> May we follow the pattern here and call this:
>
> __get_pthread_stack_min()?
>
> Any reason this isn't static inline?

Fixed.

> > +{
> > +  /* sysconf (_SC_THREAD_STACK_MIN) >= sysconf (_SC_MINSIGSTKSZ).  */
> > +  long int pthread_stack_min = GLRO(dl_minsigstacksize);
> > +  assert (pthread_stack_min != 0);
> > +  _Static_assert (__builtin_constant_p (PTHREAD_STACK_MIN),
> > +               "PTHREAD_STACK_MIN is constant");
> > +  /* Return MAX (PTHREAD_STACK_MIN, pthread_stack_min).  */
> > +  if (pthread_stack_min < PTHREAD_STACK_MIN)
> > +    pthread_stack_min = PTHREAD_STACK_MIN;
>
> Add comment:
>
> /* We have a private interface, __pthread_get_minstack@GLIBC_PRIVATE
>    which returns a larger size that includes the required TLS variable
>    space which has been determined at startup.  For sysconf here we are
>    conservative and don't include the space required for TLS access.
>    Eventually the TLS variable space will not be part of the stack
>    (Bug 11787).  */

Fixed.

> > +  return pthread_stack_min;
> > +}
> >
>
> --
> Cheers,
> Carlos.
>

Thanks.
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index 58cf1dab68..dc31e4bffa 100644
--- a/NEWS
+++ b/NEWS
@@ -9,8 +9,12 @@  Version 2.34
 
 Major new features:
 
-* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _SC_SIGSTKSZ_SOURCE or
-  _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
+* When _DYNAMIC_STACK_SIZE_SOURCE or _GNU_SOURCE are defined,
+  PTHREAD_STACK_MIN is no longer constant and is redefined to
+  sysconf(_SC_THREAD_STACK_MIN).
+
+* Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _DYNAMIC_STACK_SIZE_SOURCE
+  or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
   constant on Linux.  MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)
   and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).
 
diff --git a/include/bits/local_lim.h b/include/bits/local_lim.h
new file mode 100644
index 0000000000..46d82dc729
--- /dev/null
+++ b/include/bits/local_lim.h
@@ -0,0 +1,7 @@ 
+/* Don't define PTHREAD_STACK_MIN to sysconf (_SC_THREAD_STACK_MIN) for
+   glibc build.  */
+#if !defined _ISOMAC
+# undef __USE_DYNAMIC_STACK_SIZE
+#endif
+
+#include_next <bits/local_lim.h>
diff --git a/include/features.h b/include/features.h
index 039bcb112b..51c8a98fb0 100644
--- a/include/features.h
+++ b/include/features.h
@@ -50,8 +50,8 @@ 
    _LARGEFILE64_SOURCE	Additional functionality from LFS for large files.
    _FILE_OFFSET_BITS=N	Select default filesystem interface.
    _ATFILE_SOURCE	Additional *at interfaces.
-   _SC_SIGSTKSZ_SOURCE	Select correct (but non compile-time constant)
-			MINSIGSTKSZ and SIGSTKSZ.
+   _DYNAMIC_STACK_SIZE_SOURCE Select correct (but non compile-time constant)
+			MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN.
    _GNU_SOURCE		All of the above, plus GNU extensions.
    _DEFAULT_SOURCE	The default set of features (taking precedence over
 			__STRICT_ANSI__).
@@ -98,8 +98,8 @@ 
    __USE_FILE_OFFSET64	Define 64bit interface as default.
    __USE_MISC		Define things from 4.3BSD or System V Unix.
    __USE_ATFILE		Define *at interfaces and AT_* constants for them.
-   __USE_SC_SIGSTKSZ	Define correct (but non compile-time constant)
-			MINSIGSTKSZ and SIGSTKSZ.
+   __USE_DYNAMIC_STACK_SIZE Define correct (but non compile-time constant)
+			MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN.
    __USE_GNU		Define GNU extensions.
    __USE_FORTIFY_LEVEL	Additional security measures used, according to level.
 
@@ -143,7 +143,7 @@ 
 #undef	__USE_FILE_OFFSET64
 #undef	__USE_MISC
 #undef	__USE_ATFILE
-#undef	__USE_SC_SIGSTKSZ
+#undef	__USE_DYNAMIC_STACK_SIZE
 #undef	__USE_GNU
 #undef	__USE_FORTIFY_LEVEL
 #undef	__KERNEL_STRICT_NAMES
@@ -220,8 +220,8 @@ 
 # define _DEFAULT_SOURCE	1
 # undef  _ATFILE_SOURCE
 # define _ATFILE_SOURCE	1
-# undef  _SC_SIGSTKSZ_SOURCE
-# define _SC_SIGSTKSZ_SOURCE 1
+# undef  _DYNAMIC_STACK_SIZE_SOURCE
+# define _DYNAMIC_STACK_SIZE_SOURCE 1
 #endif
 
 /* If nothing (other than _GNU_SOURCE and _DEFAULT_SOURCE) is defined,
@@ -399,8 +399,8 @@ 
 # define __USE_ATFILE	1
 #endif
 
-#ifdef	_SC_SIGSTKSZ_SOURCE
-# define __USE_SC_SIGSTKSZ	1
+#ifdef	_DYNAMIC_STACK_SIZE_SOURCE
+# define __USE_DYNAMIC_STACK_SIZE	1
 #endif
 
 #ifdef	_GNU_SOURCE
diff --git a/manual/creature.texi b/manual/creature.texi
index 9fa658e9a7..fdd16f49cf 100644
--- a/manual/creature.texi
+++ b/manual/creature.texi
@@ -309,10 +309,10 @@  checks are applied. If defined to @math{3}, @theglibc{} may also use
 checks that may have an additional performance overhead.
 @end defvr
 
-@defvr Macro _SC_SIGSTKSZ_SOURCE
+@defvr Macro _DYNAMIC_STACK_SIZE_SOURCE
 @standards{GNU, (none)}
 If this macro is defined, correct (but non compile-time constant)
-MINSIGSTKSZ and SIGSTKSZ are defined.
+MINSIGSTKSZ, SIGSTKSZ and PTHREAD_STACK_MIN are defined.
 @end defvr
 
 @defvr Macro _REENTRANT
diff --git a/nptl/tst-context1.c b/nptl/tst-context1.c
index 821f3c2133..00e39aff9f 100644
--- a/nptl/tst-context1.c
+++ b/nptl/tst-context1.c
@@ -23,6 +23,7 @@ 
 #include <stdio.h>
 #include <stdlib.h>
 #include <ucontext.h>
+#include <support/support.h>
 
 #define N	4
 #if __WORDSIZE == 64
@@ -36,7 +37,8 @@  typedef struct {
        unsigned long	guard[3];
    } tst_context_t;
 
-static char stacks[N][2 * PTHREAD_STACK_MIN];
+static char *stacks[N];
+static size_t stack_size;
 static tst_context_t ctx[N][2];
 static volatile int failures;
 
@@ -79,7 +81,7 @@  fct (long int n)
       exit (1);
     }
 
-  if (on_stack < stacks[n] || on_stack >= stacks[n] + sizeof (stacks[0]))
+  if (on_stack < stacks[n] || on_stack >= stacks[n] + stack_size)
     {
       printf ("%ld: on_stack not on appropriate stack\n", n);
       exit (1);
@@ -109,7 +111,7 @@  tf (void *arg)
   printf ("%d: %s: before makecontext\n", n, __FUNCTION__);
 
   ctx[n][1].uctx.uc_stack.ss_sp = stacks[n];
-  ctx[n][1].uctx.uc_stack.ss_size = sizeof (stacks[n]);
+  ctx[n][1].uctx.uc_stack.ss_size = stack_size;
   ctx[n][1].uctx.uc_link = &ctx[n][0].uctx;
   makecontext (&ctx[n][1].uctx, (void (*) (void)) fct, 1, (long int) n);
 
@@ -137,6 +139,10 @@  do_test (void)
   pthread_t th[N];
   ucontext_t mctx;
 
+  stack_size = 2 * PTHREAD_STACK_MIN;
+  for (int i = 0; i < N; i++)
+    stacks[i] = xmalloc (stack_size);
+
   puts ("making contexts");
   if (getcontext (&mctx) != 0)
     {
@@ -198,6 +204,9 @@  do_test (void)
 	exit (1);
       }
 
+  for (int i = 0; i < N; i++)
+    free (stacks[i]);
+
   return failures;
 }
 
diff --git a/stdlib/test-atexit-race-common.c b/stdlib/test-atexit-race-common.c
index a2b5468580..b48bb16285 100644
--- a/stdlib/test-atexit-race-common.c
+++ b/stdlib/test-atexit-race-common.c
@@ -38,11 +38,6 @@ 
 
 const size_t kNumThreads = 1024;
 const size_t kNumHandlers = 1024;
-const size_t kStacksize =
-#ifdef PTHREAD_STACK_MIN
-	0x20000 < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN :
-#endif
-		0x20000;
 
 static void *
 threadfunc (void *unused)
@@ -66,6 +61,12 @@  do_test (void)
   /* With default 8MiB Linux stack size, creating 1024 threads can cause
      VM exhausiton on 32-bit machines.  Reduce stack size of each thread to
      128KiB for a maximum required VM size of 128MiB.  */
+  size_t kStacksize =
+#ifdef PTHREAD_STACK_MIN
+    0x20000 < PTHREAD_STACK_MIN ? PTHREAD_STACK_MIN :
+#endif
+    0x20000;
+
   xpthread_attr_setstacksize (&attr, kStacksize);
 
   for (i = 0; i < kNumThreads; ++i) {
diff --git a/support/support_path_support_time64.c b/support/support_path_support_time64.c
index 33b2bdff66..619a4eab00 100644
--- a/support/support_path_support_time64.c
+++ b/support/support_path_support_time64.c
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <fcntl.h>
+#include <unistd.h>
 #include <support/check.h>
 #include <support/support.h>
 #include <sys/stat.h>
diff --git a/sysdeps/posix/sysconf-pthread_stack_min.h b/sysdeps/posix/sysconf-pthread_stack_min.h
new file mode 100644
index 0000000000..4b1dabc79a
--- /dev/null
+++ b/sysdeps/posix/sysconf-pthread_stack_min.h
@@ -0,0 +1,29 @@ 
+/* sysconf_pthread_stack_min ().  POSIX version.
+   Copyright (C) 2021 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/>.  */
+
+/* Return sysconf (_SC_THREAD_STACK_MIN).  */
+
+static long int
+sysconf_pthread_stack_min (void)
+{
+#ifdef	PTHREAD_STACK_MIN
+      return PTHREAD_STACK_MIN;
+#else
+      return -1;
+#endif
+}
diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c
index 54d6046d00..c505995cc1 100644
--- a/sysdeps/posix/sysconf.c
+++ b/sysdeps/posix/sysconf.c
@@ -31,6 +31,7 @@ 
 #include <sys/types.h>
 #include <sys/uio.h>
 #include <regex.h>
+#include <sysconf-pthread_stack_min.h>
 
 #define NEED_SPEC_ARRAY 0
 #include <posix-conf-vars.h>
@@ -569,11 +570,7 @@  __sysconf (int name)
 #endif
 
     case _SC_THREAD_STACK_MIN:
-#ifdef	PTHREAD_STACK_MIN
-      return PTHREAD_STACK_MIN;
-#else
-      return -1;
-#endif
+      return sysconf_pthread_stack_min ();
 
     case _SC_THREAD_THREADS_MAX:
 #ifdef	PTHREAD_THREADS_MAX
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 294c366e3b..4613f7263f 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -107,7 +107,8 @@  sysdep_headers += sys/mount.h sys/acct.h \
 		  bits/types/struct_semid64_ds.h \
 		  bits/types/struct_semid64_ds_helper.h \
 		  bits/types/struct_shmid64_ds.h \
-		  bits/types/struct_shmid64_ds_helper.h
+		  bits/types/struct_shmid64_ds_helper.h \
+		  bits/pthread_stack_min.h
 
 tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
 	 tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h b/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
deleted file mode 100644
index 0652bf4a06..0000000000
--- a/sysdeps/unix/sysv/linux/aarch64/bits/local_lim.h
+++ /dev/null
@@ -1,101 +0,0 @@ 
-/* Minimum guaranteed maximum values for system limits.  Linux version.
-   Copyright (C) 1993-2021 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/>.  */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
-   and defines LINK_MAX although filesystems have different maxima.  A
-   similar thing is true for OPEN_MAX: the limit can be changed at
-   runtime and therefore the macro must not be defined.  Remove this
-   after including the header if necessary.  */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-#ifndef ARG_MAX
-# define __undef_ARG_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information.  */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN?  */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX?  */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX?  */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-/* Have to remove ARG_MAX?  */
-#ifdef __undef_ARG_MAX
-# undef ARG_MAX
-# undef __undef_ARG_MAX
-#endif
-
-/* The number of data keys per process.  */
-#define _POSIX_THREAD_KEYS_MAX	128
-/* This is the value this implementation supports.  */
-#define PTHREAD_KEYS_MAX	1024
-
-/* Controlling the iterations of destructors for thread-specific data.  */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
-/* Number of iterations this implementation does.  */
-#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process.  */
-#define _POSIX_THREAD_THREADS_MAX	64
-/* We have no predefined limit on the number of threads.  */
-#undef PTHREAD_THREADS_MAX
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
-   priority level.  */
-#define AIO_PRIO_DELTA_MAX	20
-
-/* Minimum size for a thread.  At least two pages for systems with 64k
-   pages.  */
-#define PTHREAD_STACK_MIN	131072
-
-/* Maximum number of timer expiration overruns.  */
-#define DELAYTIMER_MAX	2147483647
-
-/* Maximum tty name length.  */
-#define TTY_NAME_MAX		32
-
-/* Maximum login name length.  This is arbitrary.  */
-#define LOGIN_NAME_MAX		256
-
-/* Maximum host name length.  */
-#define HOST_NAME_MAX		64
-
-/* Maximum message queue priority level.  */
-#define MQ_PRIO_MAX		32768
-
-/* Maximum value the semaphore can have.  */
-#define SEM_VALUE_MAX   (2147483647)
diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..97215687ad
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/aarch64/bits/pthread_stack_min.h
@@ -0,0 +1,22 @@ 
+/* Definition of PTHREAD_STACK_MIN.  Linux/aarch64 version.
+   Copyright (C) 2021 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/>.  */
+
+/* Minimum size for a thread.  At least two pages for systems with 64k
+   pages.  */
+#define PTHREAD_STACK_MIN	131072
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h b/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
deleted file mode 100644
index 523407dc48..0000000000
--- a/sysdeps/unix/sysv/linux/alpha/bits/local_lim.h
+++ /dev/null
@@ -1,99 +0,0 @@ 
-/* Minimum guaranteed maximum values for system limits.  Linux/Alpha version.
-   Copyright (C) 1993-2021 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 Library General Public License as
-   published by the Free Software Foundation; either version 2 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library.  If not, see
-   <https://www.gnu.org/licenses/>.  */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
-   and defines LINK_MAX although filesystems have different maxima.  A
-   similar thing is true for OPEN_MAX: the limit can be changed at
-   runtime and therefore the macro must not be defined.  Remove this
-   after including the header if necessary.  */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-#ifndef ARG_MAX
-# define __undef_ARG_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information.  */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN?  */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX?  */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX?  */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-/* Have to remove ARG_MAX?  */
-#ifdef __undef_ARG_MAX
-# undef ARG_MAX
-# undef __undef_ARG_MAX
-#endif
-
-/* The number of data keys per process.  */
-#define _POSIX_THREAD_KEYS_MAX	128
-/* This is the value this implementation supports.  */
-#define PTHREAD_KEYS_MAX	1024
-
-/* Controlling the iterations of destructors for thread-specific data.  */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
-/* Number of iterations this implementation does.  */
-#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process.  */
-#define _POSIX_THREAD_THREADS_MAX	64
-/* We have no predefined limit on the number of threads.  */
-#undef PTHREAD_THREADS_MAX
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
-   priority level.  */
-#define AIO_PRIO_DELTA_MAX	20
-
-/* Minimum size for a thread.  We are free to choose a reasonable value.  */
-#define PTHREAD_STACK_MIN	24576
-
-/* Maximum number of timer expiration overruns.  */
-#define DELAYTIMER_MAX	2147483647
-
-/* Maximum tty name length.  */
-#define TTY_NAME_MAX		32
-
-/* Maximum login name length.  This is arbitrary.  */
-#define LOGIN_NAME_MAX		256
-
-/* Maximum host name length.  */
-#define HOST_NAME_MAX		64
-
-/* Maximum message queue priority level.  */
-#define MQ_PRIO_MAX		32768
-
-/* Maximum value the semaphore can have.  */
-#define SEM_VALUE_MAX   (2147483647)
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..5bfb0e10dd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@ 
+/* Definition of PTHREAD_STACK_MIN.  Linux/Alpha version.
+   Copyright (C) 2021 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 Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Minimum size for a thread.  We are free to choose a reasonable value.  */
+#define PTHREAD_STACK_MIN	24576
diff --git a/sysdeps/unix/sysv/linux/bits/local_lim.h b/sysdeps/unix/sysv/linux/bits/local_lim.h
index b88ca3d4d2..0b1c7f40be 100644
--- a/sysdeps/unix/sysv/linux/bits/local_lim.h
+++ b/sysdeps/unix/sysv/linux/bits/local_lim.h
@@ -78,7 +78,13 @@ 
 #define AIO_PRIO_DELTA_MAX	20
 
 /* Minimum size for a thread.  We are free to choose a reasonable value.  */
-#define PTHREAD_STACK_MIN	16384
+#undef PTHREAD_STACK_MIN
+#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE
+# include <unistd.h>
+# define PTHREAD_STACK_MIN	sysconf (_SC_THREAD_STACK_MIN)
+#else
+# include <bits/pthread_stack_min.h>
+#endif
 
 /* Maximum number of timer expiration overruns.  */
 #define DELAYTIMER_MAX	2147483647
diff --git a/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..7bd6fa1242
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@ 
+/* Definition of PTHREAD_STACK_MIN.  Linux version.
+   Copyright (C) 2021 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/>.  */
+
+/* Minimum size for a thread.  We are free to choose a reasonable value.  */
+#define PTHREAD_STACK_MIN	16384
diff --git a/sysdeps/unix/sysv/linux/bits/sigstksz.h b/sysdeps/unix/sysv/linux/bits/sigstksz.h
index 926508f2b4..cd45d122e0 100644
--- a/sysdeps/unix/sysv/linux/bits/sigstksz.h
+++ b/sysdeps/unix/sysv/linux/bits/sigstksz.h
@@ -20,7 +20,7 @@ 
 # error "Never include <bits/sigstksz.h> directly; use <signal.h> instead."
 #endif
 
-#if defined __USE_SC_SIGSTKSZ && __USE_SC_SIGSTKSZ
+#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE
 # include <unistd.h>
 
 /* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h b/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
deleted file mode 100644
index 7a9f677ec8..0000000000
--- a/sysdeps/unix/sysv/linux/ia64/bits/local_lim.h
+++ /dev/null
@@ -1,99 +0,0 @@ 
-/* Minimum guaranteed maximum values for system limits.  Linux/IA-64 version.
-   Copyright (C) 1993-2021 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/>.  */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
-   and defines LINK_MAX although filesystems have different maxima.  A
-   similar thing is true for OPEN_MAX: the limit can be changed at
-   runtime and therefore the macro must not be defined.  Remove this
-   after including the header if necessary.  */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-#ifndef ARG_MAX
-# define __undef_ARG_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information.  */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN?  */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX?  */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX?  */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-/* Have to remove ARG_MAX?  */
-#ifdef __undef_ARG_MAX
-# undef ARG_MAX
-# undef __undef_ARG_MAX
-#endif
-
-/* The number of data keys per process.  */
-#define _POSIX_THREAD_KEYS_MAX	128
-/* This is the value this implementation supports.  */
-#define PTHREAD_KEYS_MAX	1024
-
-/* Controlling the iterations of destructors for thread-specific data.  */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
-/* Number of iterations this implementation does.  */
-#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process.  */
-#define _POSIX_THREAD_THREADS_MAX	64
-/* We have no predefined limit on the number of threads.  */
-#undef PTHREAD_THREADS_MAX
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
-   priority level.  */
-#define AIO_PRIO_DELTA_MAX	20
-
-/* Minimum size for a thread.  We are free to choose a reasonable value.  */
-#define PTHREAD_STACK_MIN	196608
-
-/* Maximum number of timer expiration overruns.  */
-#define DELAYTIMER_MAX	2147483647
-
-/* Maximum tty name length.  */
-#define TTY_NAME_MAX		32
-
-/* Maximum login name length.  This is arbitrary.  */
-#define LOGIN_NAME_MAX		256
-
-/* Maximum host name length.  */
-#define HOST_NAME_MAX		64
-
-/* Maximum message queue priority level.  */
-#define MQ_PRIO_MAX		32768
-
-/* Maximum value the semaphore can have.  */
-#define SEM_VALUE_MAX   (2147483647)
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..73581506b2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ia64/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@ 
+/* Definition of PTHREAD_STACK_MIN.  Linux/IA-64 version.
+   Copyright (C) 2021 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/>.  */
+
+/* Minimum size for a thread.  We are free to choose a reasonable value.  */
+#define PTHREAD_STACK_MIN	196608
diff --git a/sysdeps/unix/sysv/linux/mips/bits/local_lim.h b/sysdeps/unix/sysv/linux/mips/bits/local_lim.h
deleted file mode 100644
index a6a0d8a980..0000000000
--- a/sysdeps/unix/sysv/linux/mips/bits/local_lim.h
+++ /dev/null
@@ -1,99 +0,0 @@ 
-/* Minimum guaranteed maximum values for system limits.  MIPS Linux version.
-   Copyright (C) 1993-2021 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/>.  */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
-   and defines LINK_MAX although filesystems have different maxima.  A
-   similar thing is true for OPEN_MAX: the limit can be changed at
-   runtime and therefore the macro must not be defined.  Remove this
-   after including the header if necessary.  */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-#ifndef ARG_MAX
-# define __undef_ARG_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information.  */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN?  */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX?  */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX?  */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-/* Have to remove ARG_MAX?  */
-#ifdef __undef_ARG_MAX
-# undef ARG_MAX
-# undef __undef_ARG_MAX
-#endif
-
-/* The number of data keys per process.  */
-#define _POSIX_THREAD_KEYS_MAX	128
-/* This is the value this implementation supports.  */
-#define PTHREAD_KEYS_MAX	1024
-
-/* Controlling the iterations of destructors for thread-specific data.  */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
-/* Number of iterations this implementation does.  */
-#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process.  */
-#define _POSIX_THREAD_THREADS_MAX	64
-/* We have no predefined limit on the number of threads.  */
-#undef PTHREAD_THREADS_MAX
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
-   priority level.  */
-#define AIO_PRIO_DELTA_MAX	20
-
-/* Minimum size for a thread.  At least two pages with 64k pages.  */
-#define PTHREAD_STACK_MIN	131072
-
-/* Maximum number of timer expiration overruns.  */
-#define DELAYTIMER_MAX	2147483647
-
-/* Maximum tty name length.  */
-#define TTY_NAME_MAX		32
-
-/* Maximum login name length.  This is arbitrary.  */
-#define LOGIN_NAME_MAX		256
-
-/* Maximum host name length.  */
-#define HOST_NAME_MAX		64
-
-/* Maximum message queue priority level.  */
-#define MQ_PRIO_MAX		32768
-
-/* Maximum value the semaphore can have.  */
-#define SEM_VALUE_MAX   (2147483647)
diff --git a/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..132f1704a5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@ 
+/* Definition of PTHREAD_STACK_MIN.  MIPS Linux version.
+   Copyright (C) 2021 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/>.  */
+
+/* Minimum size for a thread.  At least two pages with 64k pages.  */
+#define PTHREAD_STACK_MIN	131072
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h b/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
deleted file mode 100644
index 6caa627506..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/bits/local_lim.h
+++ /dev/null
@@ -1,100 +0,0 @@ 
-/* Minimum guaranteed maximum values for system limits.  Linux/PPC version.
-   Copyright (C) 1993-2021 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; see the file COPYING.LIB.  If
-   not, see <https://www.gnu.org/licenses/>.  */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
-   and defines LINK_MAX although filesystems have different maxima.  A
-   similar thing is true for OPEN_MAX: the limit can be changed at
-   runtime and therefore the macro must not be defined.  Remove this
-   after including the header if necessary.  */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-#ifndef ARG_MAX
-# define __undef_ARG_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information.  */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN?  */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX?  */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX?  */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-/* Have to remove ARG_MAX?  */
-#ifdef __undef_ARG_MAX
-# undef ARG_MAX
-# undef __undef_ARG_MAX
-#endif
-
-/* The number of data keys per process.  */
-#define _POSIX_THREAD_KEYS_MAX	128
-/* This is the value this implementation supports.  */
-#define PTHREAD_KEYS_MAX	1024
-
-/* Controlling the iterations of destructors for thread-specific data.  */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
-/* Number of iterations this implementation does.  */
-#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process.  */
-#define _POSIX_THREAD_THREADS_MAX	64
-/* We have no predefined limit on the number of threads.  */
-#undef PTHREAD_THREADS_MAX
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
-   priority level.  */
-#define AIO_PRIO_DELTA_MAX	20
-
-/* Minimum size for a thread.  At least two pages for systems with 64k
-   pages.  */
-#define PTHREAD_STACK_MIN	131072
-
-/* Maximum number of timer expiration overruns.  */
-#define DELAYTIMER_MAX	2147483647
-
-/* Maximum tty name length.  */
-#define TTY_NAME_MAX		32
-
-/* Maximum login name length.  This is arbitrary.  */
-#define LOGIN_NAME_MAX		256
-
-/* Maximum host name length.  */
-#define HOST_NAME_MAX		64
-
-/* Maximum message queue priority level.  */
-#define MQ_PRIO_MAX		32768
-
-/* Maximum value the semaphore can have.  */
-#define SEM_VALUE_MAX   (2147483647)
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..d7017e7b24
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/pthread_stack_min.h
@@ -0,0 +1,21 @@ 
+/* Definition of PTHREAD_STACK_MIN.  Linux/PPC version.
+   Copyright (C) 2021 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; see the file COPYING.LIB.  If
+   not, see <https://www.gnu.org/licenses/>.  */
+
+/* Minimum size for a thread.  At least two pages for systems with 64k
+   pages.  */
+#define PTHREAD_STACK_MIN	131072
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h b/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
deleted file mode 100644
index 4a9a8c1325..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/bits/local_lim.h
+++ /dev/null
@@ -1,99 +0,0 @@ 
-/* Minimum guaranteed maximum values for system limits.  Linux/SPARC version.
-   Copyright (C) 1993-2021 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 Library General Public License as
-   published by the Free Software Foundation; either version 2 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, see <https://www.gnu.org/licenses/>.  */
-
-/* The kernel header pollutes the namespace with the NR_OPEN symbol
-   and defines LINK_MAX although filesystems have different maxima.  A
-   similar thing is true for OPEN_MAX: the limit can be changed at
-   runtime and therefore the macro must not be defined.  Remove this
-   after including the header if necessary.  */
-#ifndef NR_OPEN
-# define __undef_NR_OPEN
-#endif
-#ifndef LINK_MAX
-# define __undef_LINK_MAX
-#endif
-#ifndef OPEN_MAX
-# define __undef_OPEN_MAX
-#endif
-#ifndef ARG_MAX
-# define __undef_ARG_MAX
-#endif
-
-/* The kernel sources contain a file with all the needed information.  */
-#include <linux/limits.h>
-
-/* Have to remove NR_OPEN?  */
-#ifdef __undef_NR_OPEN
-# undef NR_OPEN
-# undef __undef_NR_OPEN
-#endif
-/* Have to remove LINK_MAX?  */
-#ifdef __undef_LINK_MAX
-# undef LINK_MAX
-# undef __undef_LINK_MAX
-#endif
-/* Have to remove OPEN_MAX?  */
-#ifdef __undef_OPEN_MAX
-# undef OPEN_MAX
-# undef __undef_OPEN_MAX
-#endif
-/* Have to remove ARG_MAX?  */
-#ifdef __undef_ARG_MAX
-# undef ARG_MAX
-# undef __undef_ARG_MAX
-#endif
-
-/* The number of data keys per process.  */
-#define _POSIX_THREAD_KEYS_MAX	128
-/* This is the value this implementation supports.  */
-#define PTHREAD_KEYS_MAX	1024
-
-/* Controlling the iterations of destructors for thread-specific data.  */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
-/* Number of iterations this implementation does.  */
-#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
-
-/* The number of threads per process.  */
-#define _POSIX_THREAD_THREADS_MAX	64
-/* We have no predefined limit on the number of threads.  */
-#undef PTHREAD_THREADS_MAX
-
-/* Maximum amount by which a process can descrease its asynchronous I/O
-   priority level.  */
-#define AIO_PRIO_DELTA_MAX	20
-
-/* Minimum size for a thread.  We are free to choose a reasonable value.  */
-#define PTHREAD_STACK_MIN	24576
-
-/* Maximum number of timer expiration overruns.  */
-#define DELAYTIMER_MAX	2147483647
-
-/* Maximum tty name length.  */
-#define TTY_NAME_MAX		32
-
-/* Maximum login name length.  This is arbitrary.  */
-#define LOGIN_NAME_MAX		256
-
-/* Maximum host name length.  */
-#define HOST_NAME_MAX		64
-
-/* Maximum message queue priority level.  */
-#define MQ_PRIO_MAX		32768
-
-/* Maximum value the semaphore can have.  */
-#define SEM_VALUE_MAX   (2147483647)
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..bcacedb73b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@ 
+/* Definition of PTHREAD_STACK_MIN.  Linux/SPARC version.
+   Copyright (C) 2021 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 Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <https://www.gnu.org/licenses/>.  */
+
+/* Minimum size for a thread.  We are free to choose a reasonable value.  */
+#define PTHREAD_STACK_MIN	24576
diff --git a/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h b/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
new file mode 100644
index 0000000000..f2fadc8fc8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sysconf-pthread_stack_min.h
@@ -0,0 +1,33 @@ 
+/* sysconf_pthread_stack_min ().  Linux version.
+   Copyright (C) 2021 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/>.  */
+
+/* Return sysconf (_SC_THREAD_STACK_MIN).  */
+
+static long int
+sysconf_pthread_stack_min (void)
+{
+  /* sysconf (_SC_THREAD_STACK_MIN) >= sysconf (_SC_MINSIGSTKSZ).  */
+  long int pthread_stack_min = GLRO(dl_minsigstacksize);
+  assert (pthread_stack_min != 0);
+  _Static_assert (__builtin_constant_p (PTHREAD_STACK_MIN),
+		  "PTHREAD_STACK_MIN is constant");
+  /* Return MAX (PTHREAD_STACK_MIN, pthread_stack_min).  */
+  if (pthread_stack_min < PTHREAD_STACK_MIN)
+    pthread_stack_min = PTHREAD_STACK_MIN;
+  return pthread_stack_min;
+}