2 * Copyright (C) 2012 Simon Marchi <simon.marchi@polymtl.ca>
4 * SPDX-License-Identifier: GPL-2.0-only
12 #include <sys/resource.h>
20 static int pthread_attr_init_done
;
21 static pthread_attr_t tattr
;
24 size_t default_get_channel_subbuf_size(void)
26 return max(_DEFAULT_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
30 size_t default_get_metadata_subbuf_size(void)
32 return max(DEFAULT_METADATA_SUBBUF_SIZE
, PAGE_SIZE
);
36 size_t default_get_kernel_channel_subbuf_size(void)
38 return max(DEFAULT_KERNEL_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
42 size_t default_get_ust_pid_channel_subbuf_size(void)
44 return max(DEFAULT_UST_PID_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
48 size_t default_get_ust_uid_channel_subbuf_size(void)
50 return max(DEFAULT_UST_UID_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
54 pthread_attr_t
*default_pthread_attr(void)
56 if (pthread_attr_init_done
) {
60 WARN("Uninitialized pthread attributes, using libc defaults.");
64 static void __attribute__((constructor
)) init_default_pthread_attr(void)
68 size_t pthread_ss
, system_ss
, selected_ss
;
70 ret
= pthread_attr_init(&tattr
);
73 PERROR("pthread_attr_init");
77 /* Get system stack size limits. */
78 ret
= getrlimit(RLIMIT_STACK
, &rlim
);
83 DBG("Stack size limits: soft %lld, hard %lld bytes",
84 (long long) rlim
.rlim_cur
,
85 (long long) rlim
.rlim_max
);
88 * getrlimit() may return a stack size of "-1", meaning "unlimited".
89 * In this case, we impose a known-good default minimum value which will
90 * override the libc's default stack size if it is smaller.
92 system_ss
= rlim
.rlim_cur
!= -1 ? rlim
.rlim_cur
:
93 DEFAULT_LTTNG_THREAD_STACK_SIZE
;
95 /* Get pthread default thread stack size. */
96 ret
= pthread_attr_getstacksize(&tattr
, &pthread_ss
);
98 PERROR("pthread_attr_getstacksize");
101 DBG("Default pthread stack size is %zu bytes", pthread_ss
);
103 selected_ss
= max_t(size_t, pthread_ss
, system_ss
);
104 if (selected_ss
< DEFAULT_LTTNG_THREAD_STACK_SIZE
) {
105 DBG("Default stack size is too small, setting it to %zu bytes",
106 (size_t) DEFAULT_LTTNG_THREAD_STACK_SIZE
);
107 selected_ss
= DEFAULT_LTTNG_THREAD_STACK_SIZE
;
110 if (rlim
.rlim_max
> 0 && selected_ss
> rlim
.rlim_max
) {
111 WARN("Your system's stack size restrictions (%zu bytes) may be too low for the LTTng daemons to function properly, please set the stack size limit to at least %zu bytes to ensure reliable operation",
112 (size_t) rlim
.rlim_max
, (size_t) DEFAULT_LTTNG_THREAD_STACK_SIZE
);
113 selected_ss
= (size_t) rlim
.rlim_max
;
116 ret
= pthread_attr_setstacksize(&tattr
, selected_ss
);
118 PERROR("pthread_attr_setstacksize");
121 pthread_attr_init_done
= 1;
125 ret
= pthread_attr_destroy(&tattr
);
128 PERROR("pthread_attr_destroy");
132 static void __attribute__((destructor
)) fini_default_pthread_attr(void)
136 if (!pthread_attr_init_done
) {
140 ret
= pthread_attr_destroy(&tattr
);
143 PERROR("pthread_attr_destroy");