summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_thr.c
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2015-06-10 10:43:59 +0000
committermjg <mjg@FreeBSD.org>2015-06-10 10:43:59 +0000
commit67f2eebb44e1f27017750eddaf5a5ea513cb9c71 (patch)
tree4be753ea914cbf9f2ee65a2a1cc53e6989224d5d /sys/kern/kern_thr.c
parentab3ad78145346dc115fb372ccf5f9bf7731075c9 (diff)
downloadFreeBSD-src-67f2eebb44e1f27017750eddaf5a5ea513cb9c71.zip
FreeBSD-src-67f2eebb44e1f27017750eddaf5a5ea513cb9c71.tar.gz
Generalised support for copy-on-write structures shared by threads.
Thread credentials are maintained as follows: each thread has a pointer to creds and a reference on them. The pointer is compared with proc's creds on userspace<->kernel boundary and updated if needed. This patch introduces a counter which can be compared instead, so that more structures can use this scheme without adding more comparisons on the boundary.
Diffstat (limited to 'sys/kern/kern_thr.c')
-rw-r--r--sys/kern/kern_thr.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 6cd215e..e6b0a59 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -220,13 +220,13 @@ create_thread(struct thread *td, mcontext_t *ctx,
bcopy(&td->td_startcopy, &newtd->td_startcopy,
__rangeof(struct thread, td_startcopy, td_endcopy));
newtd->td_proc = td->td_proc;
- newtd->td_ucred = crhold(td->td_ucred);
+ thread_cow_get(newtd, td);
if (ctx != NULL) { /* old way to set user context */
error = set_mcontext(newtd, ctx);
if (error != 0) {
+ thread_cow_free(newtd);
thread_free(newtd);
- crfree(td->td_ucred);
goto fail;
}
} else {
@@ -238,8 +238,8 @@ create_thread(struct thread *td, mcontext_t *ctx,
/* Setup user TLS address and TLS pointer register. */
error = cpu_set_user_tls(newtd, tls_base);
if (error != 0) {
+ thread_cow_free(newtd);
thread_free(newtd);
- crfree(td->td_ucred);
goto fail;
}
}
OpenPOWER on IntegriCloud