diff options
| author | joerg <joerg@NetBSD.org> | 2017-07-02 16:41:32 +0000 |
|---|---|---|
| committer | joerg <joerg@NetBSD.org> | 2017-07-02 16:41:32 +0000 |
| commit | 58144a37c5060d2d8a3644e2aad92189a08e2245 (patch) | |
| tree | 9cfcf4d273ae8071b13b4d751a15cfcd78e191ec /lib/libpthread | |
| parent | 2c7f2320563355286f417f478f052e7e296dff36 (diff) | |
Export the guard size of the main thread via vm.guard_size. Add a
complementary writable sysctl for the initial guard size of threads
created via pthread_create. Let the existing attribut accessors do the
right thing. Raise the default guard size for threads to 64KB.
Diffstat (limited to 'lib/libpthread')
| -rw-r--r-- | lib/libpthread/TODO | 6 | ||||
| -rw-r--r-- | lib/libpthread/pthread.c | 37 | ||||
| -rw-r--r-- | lib/libpthread/pthread_attr.c | 8 | ||||
| -rw-r--r-- | lib/libpthread/pthread_attr_getguardsize.3 | 13 | ||||
| -rw-r--r-- | lib/libpthread/pthread_int.h | 3 |
5 files changed, 43 insertions, 24 deletions
diff --git a/lib/libpthread/TODO b/lib/libpthread/TODO index c68149a021e..f8cef954911 100644 --- a/lib/libpthread/TODO +++ b/lib/libpthread/TODO @@ -1,13 +1,9 @@ -$NetBSD: TODO,v 1.18 2017/02/08 03:44:41 kamil Exp $ +$NetBSD: TODO,v 1.19 2017/07/02 16:41:32 joerg Exp $ Interfaces/features to implement: - Realtime extensions: priority inheritance. -- Allow threads to change their stack size. - -- Allow threads to modify the red zone size; cf. pthread_attr_setguardsize(3). - - Keep a pool of dead LWPs so that we do not have take the full hit of _lwp_create() every time pthread_create() is called. diff --git a/lib/libpthread/pthread.c b/lib/libpthread/pthread.c index f5b1e404495..a5958b1c700 100644 --- a/lib/libpthread/pthread.c +++ b/lib/libpthread/pthread.c @@ -1,4 +1,4 @@ -/* $NetBSD: pthread.c,v 1.147 2015/05/29 16:05:13 christos Exp $ */ +/* $NetBSD: pthread.c,v 1.148 2017/07/02 16:41:32 joerg Exp $ */ /*- * Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread.c,v 1.147 2015/05/29 16:05:13 christos Exp $"); +__RCSID("$NetBSD: pthread.c,v 1.148 2017/07/02 16:41:32 joerg Exp $"); #define __EXPOSE_STACK 1 @@ -40,7 +40,9 @@ __RCSID("$NetBSD: pthread.c,v 1.147 2015/05/29 16:05:13 christos Exp $"); #include <sys/lwp.h> #include <sys/lwpctl.h> #include <sys/resource.h> +#include <sys/sysctl.h> #include <sys/tls.h> +#include <uvm/uvm_param.h> #include <assert.h> #include <dlfcn.h> @@ -115,6 +117,7 @@ int pthread__dbg; /* set by libpthread_dbg if active */ * stack pointer to thread data afterwards. */ size_t pthread__stacksize; +size_t pthread__guardsize; size_t pthread__pagesize; static struct __pthread_st *pthread__main; static size_t __pthread_st_size; @@ -164,6 +167,9 @@ pthread__init(void) pthread_t first; char *p; int i; + int mib[2]; + unsigned int value; + size_t len; extern int __isthreaded; /* @@ -182,6 +188,14 @@ pthread__init(void) pthread__pagesize = (size_t)sysconf(_SC_PAGESIZE); pthread__concurrency = (int)sysconf(_SC_NPROCESSORS_CONF); + mib[0] = CTL_VM; + mib[1] = VM_THREAD_GUARD_SIZE; + len = sizeof(value); + if (sysctl(mib, __arraycount(mib), &value, &len, NULL, 0) == 0) + pthread__guardsize = value; + else + pthread__guardsize = pthread__pagesize; + /* Initialize locks first; they're needed elsewhere. */ pthread__lockprim_init(); for (i = 0; i < NHASHLOCK; i++) { @@ -335,16 +349,19 @@ pthread__getstack(pthread_t newthread, const pthread_attr_t *attr) if (attr != NULL) { pthread_attr_getstack(attr, &stackbase, &stacksize); + pthread_attr_getguardsize(attr, &guardsize); } else { stackbase = NULL; stacksize = 0; + guardsize = pthread__guardsize; } if (stacksize == 0) stacksize = pthread__stacksize; if (newthread->pt_stack_allocated) { if (stackbase == NULL && - newthread->pt_stack.ss_size == stacksize) + newthread->pt_stack.ss_size == stacksize && + newthread->pt_guardsize == guardsize) return 0; stackbase2 = newthread->pt_stack.ss_sp; #ifndef __MACHINE_STACK_GROWS_UP @@ -362,14 +379,13 @@ pthread__getstack(pthread_t newthread, const pthread_attr_t *attr) if (stackbase == NULL) { stacksize = ((stacksize - 1) | (pthread__pagesize - 1)) + 1; - guardsize = pthread__pagesize; + guardsize = ((guardsize - 1) | (pthread__pagesize - 1)) + 1; stackbase = mmap(NULL, stacksize + guardsize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, (off_t)0); if (stackbase == MAP_FAILED) return ENOMEM; allocated = true; } else { - guardsize = 0; allocated = false; } #ifdef __MACHINE_STACK_GROWS_UP @@ -1280,7 +1296,9 @@ pthread__initmainstack(void) { struct rlimit slimit; const AuxInfo *aux; - size_t size; + size_t size, len; + int mib[2]; + unsigned int value; _DIAGASSERT(_dlauxinfo() != NULL); @@ -1289,6 +1307,13 @@ pthread__initmainstack(void) "Couldn't get stack resource consumption limits"); size = slimit.rlim_cur; pthread__main->pt_stack.ss_size = size; + pthread__main->pt_guardsize = pthread__pagesize; + + mib[0] = CTL_VM; + mib[1] = VM_GUARD_SIZE; + len = sizeof(value); + if (sysctl(mib, __arraycount(mib), &value, &len, NULL, 0) == 0) + pthread__main->pt_guardsize = value; for (aux = _dlauxinfo(); aux->a_type != AT_NULL; ++aux) { if (aux->a_type == AT_STACKBASE) { diff --git a/lib/libpthread/pthread_attr.c b/lib/libpthread/pthread_attr.c index d0b861e2f8e..7f4f4b8cc78 100644 --- a/lib/libpthread/pthread_attr.c +++ b/lib/libpthread/pthread_attr.c @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_attr.c,v 1.16 2012/03/02 18:06:05 joerg Exp $ */ +/* $NetBSD: pthread_attr.c,v 1.17 2017/07/02 16:41:32 joerg Exp $ */ /*- * Copyright (c) 2001, 2002, 2003, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_attr.c,v 1.16 2012/03/02 18:06:05 joerg Exp $"); +__RCSID("$NetBSD: pthread_attr.c,v 1.17 2017/07/02 16:41:32 joerg Exp $"); #include <errno.h> #include <stdio.h> @@ -107,7 +107,7 @@ pthread_attr_get_np(pthread_t thread, pthread_attr_t *attr) p->ptap_namearg = thread->pt_name; p->ptap_stackaddr = thread->pt_stack.ss_sp; p->ptap_stacksize = thread->pt_stack.ss_size; - p->ptap_guardsize = pthread__pagesize; + p->ptap_guardsize = thread->pt_guardsize; return pthread_getschedparam(thread, &p->ptap_policy, &p->ptap_sp); } @@ -150,7 +150,7 @@ pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guard) struct pthread_attr_private *p; if ((p = attr->pta_private) == NULL) - *guard = (size_t)sysconf(_SC_PAGESIZE); + *guard = pthread__guardsize; else *guard = p->ptap_guardsize; diff --git a/lib/libpthread/pthread_attr_getguardsize.3 b/lib/libpthread/pthread_attr_getguardsize.3 index 6d39004a415..6e15c400020 100644 --- a/lib/libpthread/pthread_attr_getguardsize.3 +++ b/lib/libpthread/pthread_attr_getguardsize.3 @@ -1,4 +1,4 @@ -.\" $NetBSD: pthread_attr_getguardsize.3,v 1.3 2016/04/07 06:21:48 dholland Exp $ +.\" $NetBSD: pthread_attr_getguardsize.3,v 1.4 2017/07/02 16:41:32 joerg Exp $ .\" .\" Copyright (c) 2010 Jukka Ruohonen <jruohonen@iki.fi> .\" All rights reserved. @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd July 7, 2010 +.Dd July 2, 2017 .Dt PTHREAD_ATTR_GETGUARDSIZE 3 .Os .Sh NAME @@ -66,12 +66,9 @@ In .Nx the default .Fa guardsize -is the system page size. -(This value is often 4096 bytes but varies on some ports; the -precise value can be retrieved by using -.Xr sysconf 3 -with -.Dv _SC_PAGESIZE . ) +is given by the +.Pa vm.thread_guard_size +.Xr sysctl 7 . .Pp The rationale behind .Fa guardsize diff --git a/lib/libpthread/pthread_int.h b/lib/libpthread/pthread_int.h index 17f4ac97034..4a5e958393d 100644 --- a/lib/libpthread/pthread_int.h +++ b/lib/libpthread/pthread_int.h @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_int.h,v 1.93 2017/02/08 03:44:41 kamil Exp $ */ +/* $NetBSD: pthread_int.h,v 1.94 2017/07/02 16:41:32 joerg Exp $ */ /*- * Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -171,6 +171,7 @@ struct __pthread_st { #define PT_ATTR_DEAD 0xDEAD0002 extern size_t pthread__stacksize; +extern size_t pthread__guardsize; extern size_t pthread__pagesize; extern int pthread__nspins; extern int pthread__concurrency; |
