Revert GLIBC_PTHREAD_DEFAULT_STACKSIZE changes.
authorCarlos O'Donell <carlos@redhat.com>
Fri, 1 Mar 2013 21:18:08 +0000 (16:18 -0500)
committerCarlos O'Donell <carlos@redhat.com>
Fri, 1 Mar 2013 21:18:08 +0000 (16:18 -0500)
This reverts the change that allows the POSIX Thread default stack size
to be changed by the environment variable
GLIBC_PTHREAD_DEFAULT_STACKSIZE. It has been requested that more
discussion happen before this change goes into 2.18.

ChangeLog
NEWS
csu/libc-start.c
csu/libc-tls.c
nptl/ChangeLog
nptl/Makefile
nptl/nptl-init.c
nptl/tst-pthread-stack-env.c [deleted file]

index 864832330ce61a5c82a79e4e5466e8cfba659004..46edfc0bea91246fdef863305cec0859c0e75356 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-01  Carlos O'Donell  <carlos@redhat.com>
+
+       * csu/libc-start.c (__pthread_initialize_minimal): Revert last change.
+       * csu/libc-tls.c (__pthread_initialize_minimal): Likewise.
+
 2013-03-01  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
        * NEWS: Mention libm performance improvements and non-x86 PI
diff --git a/NEWS b/NEWS
index 313ccd78d9a91133709e6d11143f2813467b0401..c5e38b3f625586fe763f436756a4ba523cd81576 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,10 +17,6 @@ Version 2.18
   and program exit.  This needs compiler support for offloading C++11
   destructor calls to glibc.
 
-* Add support for setting thread stack sizes from the program environment,
-  independently of the process stack size using the
-  GLIBC_PTHREAD_DEFAULT_STACKSIZE environment variable.
-
 * Improved worst case performance of libm functions with double inputs and
   output.
 
index f53f71c975f1abdf525509db7a31ccc0f705c60f..9c4c01d9fd37b61f883665d9ac51f80cbf63adb8 100644 (file)
@@ -30,7 +30,7 @@ extern int __libc_multiple_libcs;
 #include <tls.h>
 #ifndef SHARED
 # include <dl-osinfo.h>
-extern void __pthread_initialize_minimal (int, char **, char **);
+extern void __pthread_initialize_minimal (void);
 # ifndef THREAD_SET_STACK_GUARD
 /* Only exported for architectures that don't store the stack guard canary
    in thread local area.  */
@@ -167,7 +167,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
   /* Initialize the thread library at least a bit since the libgcc
      functions are using thread functions if these are available and
      we need to setup errno.  */
-  __pthread_initialize_minimal (argc, argv, __environ);
+  __pthread_initialize_minimal ();
 
   /* Set up the stack checker's canary.  */
   uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
index 4c20bb55315763882b2c3c87d20b2e7761d3b0ca..5fa39eb8d1ca9a5e010a4c7ded3daae632a1f47b 100644 (file)
@@ -243,7 +243,7 @@ _dl_tls_setup (void)
    not used.  */
 void
 __attribute__ ((weak))
-__pthread_initialize_minimal (int argc, char **argv, char **envp)
+__pthread_initialize_minimal (void)
 {
   __libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN);
 }
index 4beb77c43e5b981ebc909443cfbd370c130e11a4..2374bbfd1783d8eebacd46e16d690bdca9e968e2 100644 (file)
@@ -1,3 +1,11 @@
+2013-03-01  Carlos O'Donell  <carlos@redhat.com>
+
+       * Makefile (tests): Revert last change.
+       (tst-pthread-stack-env-ENV): Likewise.
+       * nptl-init.c (set_default_stacksize): Likewise.
+       (__pthread_initialize_minimal_internal): Likewise.
+       * tst-pthread-stack-env.c: Likewise.
+
 2013-03-01  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
        * tst-oddstacklimit.c: Include stdlib.h.
index e7cfe8bcd44def6eee50fec3e2fbe4f908767866..6af4b37af4843fbd2328adae10ec7c77a0af814b 100644 (file)
@@ -251,8 +251,7 @@ tests = tst-typesizes \
        tst-exec1 tst-exec2 tst-exec3 tst-exec4 \
        tst-exit1 tst-exit2 tst-exit3 \
        tst-stdio1 tst-stdio2 \
-       tst-stack1 tst-stack2 tst-stack3 \
-       tst-pthread-getattr tst-pthread-stack-env \
+       tst-stack1 tst-stack2 tst-stack3 tst-pthread-getattr \
        tst-unload \
        tst-dlsym1 \
        tst-sysconf \
@@ -442,8 +441,6 @@ tst-cancel7-ARGS = --command "exec $(host-test-program-cmd)"
 tst-cancelx7-ARGS = $(tst-cancel7-ARGS)
 tst-umask1-ARGS = $(objpfx)tst-umask1.temp
 
-tst-pthread-stack-env-ENV = GLIBC_PTHREAD_DEFAULT_STACKSIZE=1048576
-
 $(objpfx)tst-atfork2: $(libdl) $(shared-thread-library)
 LDFLAGS-tst-atfork2 = -rdynamic
 tst-atfork2-ENV = MALLOC_TRACE=$(objpfx)tst-atfork2.mtrace
index 50148224e87eecd32e0260c3a28fd894499a2fdb..19e66164202c118f12a81f69c2567a78fb3e73f9 100644 (file)
@@ -276,26 +276,8 @@ extern void **__libc_dl_error_tsd (void) __attribute__ ((const));
 /* This can be set by the debugger before initialization is complete.  */
 static bool __nptl_initial_report_events __attribute_used__;
 
-static void
-set_default_stacksize (size_t stacksize)
-{
-  if (stacksize < PTHREAD_STACK_MIN)
-    stacksize = PTHREAD_STACK_MIN;
-
-  /* Make sure it meets the minimum size that allocate_stack
-     (allocatestack.c) will demand, which depends on the page size.  */
-  const uintptr_t pagesz = GLRO(dl_pagesize);
-  const size_t minstack = pagesz + __static_tls_size + MINIMAL_REST_STACK;
-
-  if (stacksize < minstack)
-    stacksize = minstack;
-
-  /* Round the resource limit up to page size.  */
-  stacksize = (stacksize + pagesz - 1) & -pagesz;
-  __default_stacksize = stacksize;
-}
 void
-__pthread_initialize_minimal_internal (int argc, char **argv, char **envp)
+__pthread_initialize_minimal_internal (void)
 {
 #ifndef SHARED
   /* Unlike in the dynamically linked case the dynamic linker has not
@@ -419,41 +401,29 @@ __pthread_initialize_minimal_internal (int argc, char **argv, char **envp)
 
   __static_tls_size = roundup (__static_tls_size, static_tls_align);
 
-  /* Initialize the environment.  libc.so gets initialized after us due to a
-     circular dependency and hence __environ is not available otherwise.  */
-    __environ = envp;
-
-#ifndef SHARED
-    __libc_init_secure ();
-#endif
-
-  size_t stacksize = 0;
-  char *envval = __libc_secure_getenv ("GLIBC_PTHREAD_DEFAULT_STACKSIZE");
-
-  if (__glibc_unlikely (envval != NULL && envval[0] != '\0'))
-    {
-      char *env_conv = envval;
-      size_t ret = strtoul (envval, &env_conv, 0);
+  /* Determine the default allowed stack size.  This is the size used
+     in case the user does not specify one.  */
+  struct rlimit limit;
+  if (getrlimit (RLIMIT_STACK, &limit) != 0
+      || limit.rlim_cur == RLIM_INFINITY)
+    /* The system limit is not usable.  Use an architecture-specific
+       default.  */
+    limit.rlim_cur = ARCH_STACK_DEFAULT_SIZE;
+  else if (limit.rlim_cur < PTHREAD_STACK_MIN)
+    /* The system limit is unusably small.
+       Use the minimal size acceptable.  */
+    limit.rlim_cur = PTHREAD_STACK_MIN;
 
-      if (*env_conv == '\0' && env_conv != envval)
-       stacksize = ret;
-    }
-
-  if (stacksize == 0)
-    {
-      /* Determine the default allowed stack size.  This is the size used
-        in case the user does not specify one.  */
-      struct rlimit limit;
-      if (getrlimit (RLIMIT_STACK, &limit) != 0
-         || limit.rlim_cur == RLIM_INFINITY)
-       /* The system limit is not usable.  Use an architecture-specific
-          default.  */
-       stacksize = ARCH_STACK_DEFAULT_SIZE;
-      else
-       stacksize = limit.rlim_cur;
-    }
+  /* Make sure it meets the minimum size that allocate_stack
+     (allocatestack.c) will demand, which depends on the page size.  */
+  const uintptr_t pagesz = GLRO(dl_pagesize);
+  const size_t minstack = pagesz + __static_tls_size + MINIMAL_REST_STACK;
+  if (limit.rlim_cur < minstack)
+    limit.rlim_cur = minstack;
 
-  set_default_stacksize (stacksize);
+  /* Round the resource limit up to page size.  */
+  limit.rlim_cur = (limit.rlim_cur + pagesz - 1) & -pagesz;
+  __default_stacksize = limit.rlim_cur;
 
 #ifdef SHARED
   /* Transfer the old value from the dynamic linker's internal location.  */
diff --git a/nptl/tst-pthread-stack-env.c b/nptl/tst-pthread-stack-env.c
deleted file mode 100644 (file)
index 09f0304..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Verify that pthreads uses the default thread stack size set with the
-   GLIBC_PTHREAD_DEFAULT_STACKSIZE environment variable.
-   Copyright (C) 2013 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
-   <http://www.gnu.org/licenses/>.  */
-
-#include <pthread.h>
-#include <stdio.h>
-#include <string.h>
-
-/* It is possible that the default stack size somehow ends up being 1MB, thus
-   giving a false positive.  The ideal way to test this would be to get the
-   current stacksize fork a process with the default stack size set to
-   something different to the current stack size and verify in the child
-   process that the environment variable worked.  */
-#define STACKSIZE 1024 * 1024L
-
-void *
-thr (void *u)
-{
-  size_t stacksize, guardsize;
-  pthread_attr_t attr;
-  pthread_getattr_np (pthread_self (), &attr);
-
-  pthread_attr_getstacksize (&attr, &stacksize);
-  pthread_attr_getguardsize (&attr, &guardsize);
-
-  /* FIXME once guardsize is excluded from stacksize.  */
-  if (stacksize - guardsize != STACKSIZE)
-    {
-      printf ("Stack size is %zu, should be %zu\n", stacksize - guardsize,
-             STACKSIZE);
-      return (void *) 1;
-    }
-
-  return NULL;
-}
-
-int
-do_test (int argc, char **argv)
-{
-  pthread_t t;
-  void *thr_ret;
-  int ret;
-
-  if ((ret = pthread_create (&t, NULL, thr, NULL)) != 0)
-    {
-      printf ("thread create failed: %s\n", strerror (ret));
-      return 1;
-    }
-
-  if ((ret = pthread_join (t, &thr_ret)) != 0)
-    {
-      printf ("join failed: %s\n", strerror (ret));
-      return 1;
-    }
-
-  if (thr_ret != NULL && thr_ret != PTHREAD_CANCELED)
-    return 1;
-
-  return 0;
-}
-
-#include "../test-skeleton.c"