diff options
author | Etienne Dechamps <[email protected]> | 2012-09-27 13:31:46 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-10-03 13:32:48 -0700 |
commit | 0aebd4f9e3223e8f1e09de7b29bba4f375db840c (patch) | |
tree | 87de1c6b6e8ba60d124a5bafe8880aa69cbff254 /lib | |
parent | 6d1d976b2c2c6b80de75a480c998466068066846 (diff) |
Create threads in detached state in userspace.
Currently, thread_create(), when called in userspace, creates a
joinable (i.e. not detached thread). This is the pthread default.
Unfortunately, this does not reproduce kthreads behavior (kthreads
are always detached). In addition, this contradicts the original
Solaris code which creates userspace threads in detached mode.
These joinable threads are never joined, which leads to a leakage of
pthread thread objects ("zombie threads"). This in turn results in
excessive ressource consumption, and possible ressource exhaustion in
extreme cases (e.g. long ztest runs).
This patch fixes the issue by creating userspace threads in detached
mode. The only exception is ztest worker threads which are meant to be
joinable.
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #989
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libzpool/kernel.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c index 704f3d659..c38efd0aa 100644 --- a/lib/libzpool/kernel.c +++ b/lib/libzpool/kernel.c @@ -141,7 +141,7 @@ zk_thread_helper(void *arg) kthread_t * zk_thread_create(caddr_t stk, size_t stksize, thread_func_t func, void *arg, - size_t len, proc_t *pp, int state, pri_t pri) + size_t len, proc_t *pp, int state, pri_t pri, int detachstate) { kthread_t *kt; pthread_attr_t attr; @@ -181,6 +181,7 @@ zk_thread_create(caddr_t stk, size_t stksize, thread_func_t func, void *arg, VERIFY3S(pthread_attr_init(&attr), ==, 0); VERIFY3S(pthread_attr_setstacksize(&attr, stack), ==, 0); VERIFY3S(pthread_attr_setguardsize(&attr, PAGESIZE), ==, 0); + VERIFY3S(pthread_attr_setdetachstate(&attr, detachstate), ==, 0); VERIFY3S(pthread_create(&kt->t_tid, &attr, &zk_thread_helper, kt), ==, 0); |