From f839de283c44ffe46a2d14bfdf854c145abd8ed6 Mon Sep 17 00:00:00 2001 From: Colin Ian King Date: Mon, 19 Jul 2021 20:49:34 +0100 Subject: [PATCH] Detemine minimal stack size via sysconf, then PTHREAD_STACK_MIN then guess Don't rely on PTHREAD_STACK_MIN being defined, use sysconf, then PTHREAD_STACK_MIN if it is defined, then 8K default. Signed-off-by: Colin Ian King --- core-helper.c | 31 +++++++++++++++++++++++++++++++ stress-ng.h | 1 + stress-pthread.c | 13 ++----------- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/core-helper.c b/core-helper.c index 508627f2..97a3b869 100644 --- a/core-helper.c +++ b/core-helper.c @@ -2494,6 +2494,37 @@ size_t stress_min_sig_stack_size(void) return (size_t)sz; } +size_t stress_min_pthread_stack_size(void) +{ + static long sz = -1, min; + + /* return cached copy */ + if (sz > 0) + return sz; + + min = stress_min_aux_sig_stack_size(); +#if defined(__SC_THREAD_STACK_MIN_VALUE) + sz = sysconf(__SC_THREAD_STACK_MIN_VALUE); + if (sz > min) + min = sz; +#endif +#if defined(_SC_THREAD_STACK_MIN_VALUE) + sz = sysconf(_SC_THREAD_STACK_MIN_VALUE); + if (sz > min) + min = sz; +#endif +#if defined(PTHREAD_STACK_MIN) + if (PTHREAD_STACK_MIN > min) + min = PTHREAD_STACK_MIN; +#endif + if (8192 > min) + min = 8192; + + sz = min; + + return (size_t)sz; +} + /* * stress_sig_handler_exit() * signal handler that exits a process via _exit(0) for diff --git a/stress-ng.h b/stress-ng.h index 8a8b17ae..cd744756 100644 --- a/stress-ng.h +++ b/stress-ng.h @@ -4056,6 +4056,7 @@ extern WARN_UNUSED int32_t stress_get_opt_ionice_class(const char *const str); /* Misc helper funcs */ extern WARN_UNUSED size_t stress_sig_stack_size(void); extern WARN_UNUSED size_t stress_min_sig_stack_size(void); +extern WARN_UNUSED size_t stress_min_pthread_stack_size(void); #define STRESS_SIGSTKSZ (stress_sig_stack_size()) #define STRESS_MINSIGSTKSZ (stress_min_sig_stack_size()) diff --git a/stress-pthread.c b/stress-pthread.c index 0da3aeec..27777af8 100644 --- a/stress-pthread.c +++ b/stress-pthread.c @@ -69,12 +69,7 @@ static const stress_opt_set_func_t opt_set_funcs[] = { #if defined(HAVE_LIB_PTHREAD) -/* Some systems such as GNU/HURD don't define PTHREAD_STACK_MIN */ -#if !defined(PTHREAD_STACK_MIN) -#define PTHREAD_STACK_MIN (16 * KB) -#endif - -#define DEFAULT_STACK_MIN (16 * KB) +#define DEFAULT_STACK_MIN (8 * KB) #if defined(HAVE_GET_ROBUST_LIST) && \ defined(HAVE_LINUX_FUTEX_H) @@ -404,11 +399,7 @@ static int stress_pthread(const stress_args_t *args) stress_pthread_args_t pargs = { args, NULL, 0 }; sigset_t set; #if defined(HAVE_PTHREAD_ATTR_SETSTACK) -#if DEFAULT_STACK_MIN == PTHREAD_STACK_MIN - const size_t stack_size = PTHREAD_STACK_MIN; -#else - const size_t stack_size = STRESS_MAXIMUM(DEFAULT_STACK_MIN, PTHREAD_STACK_MIN); -#endif + const size_t stack_size = STRESS_MAXIMUM(DEFAULT_STACK_MIN, stress_min_pthread_stack_size()); #endif keep_running_flag = true;