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
;
23 size_t default_get_channel_subbuf_size(void)
25 return max(_DEFAULT_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
28 size_t default_get_metadata_subbuf_size(void)
30 return max(DEFAULT_METADATA_SUBBUF_SIZE
, PAGE_SIZE
);
33 size_t default_get_kernel_channel_subbuf_size(void)
35 return max(DEFAULT_KERNEL_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
38 size_t default_get_ust_pid_channel_subbuf_size(void)
40 return max(DEFAULT_UST_PID_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
43 size_t default_get_ust_uid_channel_subbuf_size(void)
45 return max(DEFAULT_UST_UID_CHANNEL_SUBBUF_SIZE
, PAGE_SIZE
);
48 pthread_attr_t
*default_pthread_attr(void)
50 if (pthread_attr_init_done
) {
54 WARN("Uninitialized pthread attributes, using libc defaults.");
58 static void __attribute__((constructor
)) init_default_pthread_attr(void)
62 size_t pthread_ss
, system_ss
, selected_ss
;
64 ret
= pthread_attr_init(&tattr
);
67 PERROR("pthread_attr_init");
71 /* Get system stack size limits. */
72 ret
= getrlimit(RLIMIT_STACK
, &rlim
);
77 DBG("Stack size limits: soft %lld, hard %lld bytes",
78 (long long) rlim
.rlim_cur
,
79 (long long) rlim
.rlim_max
);
82 * getrlimit() may return a stack size of "-1", meaning "unlimited".
83 * In this case, we impose a known-good default minimum value which will
84 * override the libc's default stack size if it is smaller.
86 system_ss
= rlim
.rlim_cur
!= -1 ? rlim
.rlim_cur
:
87 DEFAULT_LTTNG_THREAD_STACK_SIZE
;
89 /* Get pthread default thread stack size. */
90 ret
= pthread_attr_getstacksize(&tattr
, &pthread_ss
);
92 PERROR("pthread_attr_getstacksize");
95 DBG("Default pthread stack size is %zu bytes", pthread_ss
);
97 selected_ss
= max_t(size_t, pthread_ss
, system_ss
);
98 if (selected_ss
< DEFAULT_LTTNG_THREAD_STACK_SIZE
) {
99 DBG("Default stack size is too small, setting it to %zu bytes",
100 (size_t) DEFAULT_LTTNG_THREAD_STACK_SIZE
);
101 selected_ss
= DEFAULT_LTTNG_THREAD_STACK_SIZE
;
104 if (rlim
.rlim_max
> 0 && selected_ss
> rlim
.rlim_max
) {
105 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",
106 (size_t) rlim
.rlim_max
, (size_t) DEFAULT_LTTNG_THREAD_STACK_SIZE
);
107 selected_ss
= (size_t) rlim
.rlim_max
;
110 ret
= pthread_attr_setstacksize(&tattr
, selected_ss
);
112 PERROR("pthread_attr_setstacksize");
115 pthread_attr_init_done
= 1;
119 ret
= pthread_attr_destroy(&tattr
);
122 PERROR("pthread_attr_destroy");
126 static void __attribute__((destructor
)) fini_default_pthread_attr(void)
130 if (!pthread_attr_init_done
) {
134 ret
= pthread_attr_destroy(&tattr
);
137 PERROR("pthread_attr_destroy");