| From f839de283c44ffe46a2d14bfdf854c145abd8ed6 Mon Sep 17 00:00:00 2001 |
| From: Colin Ian King <colin.king@canonical.com> |
| 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. |
| |
| Upstream-Status: Backport [https://kernel.ubuntu.com/git/cking/stress-ng.git/commit/?id=f839de283c44ffe46a2d14bfdf854c145abd8ed6] |
| Signed-off-by: Colin Ian King <colin.king@canonical.com> |
| --- |
| 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; |
| -- |
| 2.32.0 |