Close a race between thr_create and sysctl -w, the thr_scope_sys could

be changed when thr_create is running, and we tested it for several times.
This commit is contained in:
David Xu 2004-10-06 02:29:19 +00:00
parent 57259f2864
commit 195f5806e4

View File

@ -76,6 +76,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
int error;
struct ksegrp *kg, *newkg;
struct proc *p;
int scope_sys;
p = td->td_proc;
kg = td->td_ksegrp;
@ -87,9 +88,11 @@ thr_create(struct thread *td, struct thr_create_args *uap)
(p->p_numthreads >= max_threads_per_proc)) {
return (EPROCLIM);
}
scope_sys = thr_scope_sys;
/* Initialize our td and new ksegrp.. */
newtd = thread_alloc();
if (thr_scope_sys)
if (scope_sys)
newkg = ksegrp_alloc();
else
newkg = kg;
@ -99,7 +102,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
*/
id = newtd->td_tid;
if ((error = copyout(&id, uap->id, sizeof(long)))) {
if (thr_scope_sys)
if (scope_sys)
ksegrp_free(newkg);
thread_free(newtd);
return (error);
@ -110,7 +113,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
bcopy(&td->td_startcopy, &newtd->td_startcopy,
(unsigned) RANGEOF(struct thread, td_startcopy, td_endcopy));
if (thr_scope_sys) {
if (scope_sys) {
bzero(&newkg->kg_startzero,
(unsigned)RANGEOF(struct ksegrp, kg_startzero, kg_endzero));
bcopy(&kg->kg_startcopy, &newkg->kg_startcopy,
@ -124,7 +127,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
cpu_set_upcall(newtd, td);
error = set_mcontext(newtd, &ctx.uc_mcontext);
if (error != 0) {
if (thr_scope_sys)
if (scope_sys)
ksegrp_free(newkg);
thread_free(newtd);
crfree(td->td_ucred);
@ -133,7 +136,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
/* Link the thread and kse into the ksegrp and make it runnable. */
PROC_LOCK(td->td_proc);
if (thr_scope_sys) {
if (scope_sys) {
sched_init_concurrency(newkg);
} else {
if ((td->td_proc->p_flag & P_HADTHREADS) == 0) {
@ -145,7 +148,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
td->td_proc->p_flag |= P_HADTHREADS;
newtd->td_sigmask = td->td_sigmask;
mtx_lock_spin(&sched_lock);
if (thr_scope_sys)
if (scope_sys)
ksegrp_link(newkg, p);
thread_link(newtd, newkg);
mtx_unlock_spin(&sched_lock);
@ -153,7 +156,7 @@ thr_create(struct thread *td, struct thr_create_args *uap)
/* let the scheduler know about these things. */
mtx_lock_spin(&sched_lock);
if (thr_scope_sys)
if (scope_sys)
sched_fork_ksegrp(td, newkg);
sched_fork_thread(td, newtd);