summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/stress-ng/stress-ng/0001-Detemine-minimal-stack-size-via-sysconf-then-PTHREAD.patch
blob: d275e3d7f93838220cad9037ca4369fc1413f7fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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