Add a knob LIBPTHREAD_BIGSTACK_MAIN, which instructs libthr to leave
the whole RLIMIT_STACK-sized region of the kernel-allocated stack as the stack of main thread. By default, the main thread stack is clamped at 2MB (4MB on 64bit ABIs) and the rest is used for other threads stack allocation. Since there is no programmatic way to adjust the size of the main thread stack, pthread_attr_setstacksize() is too late, the knob allows user to manage the main stack size both for single-threaded and multi-threaded processes with the rlimit. Reported by: "Ivan A. Kosarev" <ivan@ivan-labs.com> Tested by: dim Sponsored by: The FreeBSD Foundation MFC after: 3 days
This commit is contained in:
parent
f6abec6c64
commit
6c8ce3bfce
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=269909
@ -37,6 +37,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/ttycom.h>
|
||||
#include <sys/mman.h>
|
||||
@ -441,6 +442,7 @@ init_main_thread(struct pthread *thread)
|
||||
static void
|
||||
init_private(void)
|
||||
{
|
||||
struct rlimit rlim;
|
||||
size_t len;
|
||||
int mib[2];
|
||||
char *env;
|
||||
@ -471,6 +473,12 @@ init_private(void)
|
||||
len = sizeof (_usrstack);
|
||||
if (sysctl(mib, 2, &_usrstack, &len, NULL, 0) == -1)
|
||||
PANIC("Cannot get kern.usrstack from sysctl");
|
||||
env = getenv("LIBPTHREAD_BIGSTACK_MAIN");
|
||||
if (env != NULL) {
|
||||
if (getrlimit(RLIMIT_STACK, &rlim) == -1)
|
||||
PANIC("Cannot get stack rlimit");
|
||||
_thr_stack_initial = rlim.rlim_cur;
|
||||
}
|
||||
len = sizeof(_thr_is_smp);
|
||||
sysctlbyname("kern.smp.cpus", &_thr_is_smp, &len, NULL, 0);
|
||||
_thr_is_smp = (_thr_is_smp > 1);
|
||||
|
@ -246,7 +246,10 @@ _thr_stack_alloc(struct pthread_attr *attr)
|
||||
THREAD_LIST_UNLOCK(curthread);
|
||||
}
|
||||
else {
|
||||
/* Allocate a stack from usrstack. */
|
||||
/*
|
||||
* Allocate a stack from or below usrstack, depending
|
||||
* on the LIBPTHREAD_BIGSTACK_MAIN env variable.
|
||||
*/
|
||||
if (last_stack == NULL)
|
||||
last_stack = _usrstack - _thr_stack_initial -
|
||||
_thr_guard_default;
|
||||
|
Loading…
Reference in New Issue
Block a user