From owner-p4-projects@FreeBSD.ORG Thu Mar 10 02:45:35 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5E02316A4D0; Thu, 10 Mar 2005 02:45:35 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 31BFA16A4CE for ; Thu, 10 Mar 2005 02:45:35 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 023A043D31 for ; Thu, 10 Mar 2005 02:45:35 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j2A2jYXe094600 for ; Thu, 10 Mar 2005 02:45:34 GMT (envelope-from davidxu@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j2A2jYgS094597 for perforce@freebsd.org; Thu, 10 Mar 2005 02:45:34 GMT (envelope-from davidxu@freebsd.org) Date: Thu, 10 Mar 2005 02:45:34 GMT Message-Id: <200503100245.j2A2jYgS094597@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to davidxu@freebsd.org using -f From: David Xu To: Perforce Change Reviews Subject: PERFORCE change 72814 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Mar 2005 02:45:36 -0000 http://perforce.freebsd.org/chv.cgi?CH=72814 Change 72814 by davidxu@davidxu_celeron on 2005/03/10 02:45:07 Implement system and process scope concept for pthread. Not tested! Affected files ... .. //depot/projects/davidxu_thread/src/sys/kern/kern_thr.c#8 edit .. //depot/projects/davidxu_thread/src/sys/kern/kern_thread.c#5 edit .. //depot/projects/davidxu_thread/src/sys/sys/proc.h#7 edit .. //depot/projects/davidxu_thread/src/sys/sys/thr.h#3 edit Differences ... ==== //depot/projects/davidxu_thread/src/sys/kern/kern_thr.c#8 (text+ko) ==== @@ -83,37 +83,23 @@ return (EPROCLIM); } - scope_sys = thr_scope_sys; + scope_sys = (uap->flags & THR_SYSTEM_SCOPE) != 0; /* Initialize our td and new ksegrp.. */ newtd = thread_alloc(); - if (scope_sys) - newkg = ksegrp_alloc(); - else - newkg = kg; + /* * Try the copyout as soon as we allocate the td so we don't have to * tear things down in a failure case below. */ id = newtd->td_tid; if ((error = copyout(&id, uap->id, sizeof(long)))) { - if (scope_sys) - ksegrp_free(newkg); thread_free(newtd); return (error); } - bzero(&newtd->td_startzero, __rangeof(struct thread, td_startzero, td_endzero)); bcopy(&td->td_startcopy, &newtd->td_startcopy, __rangeof(struct thread, td_startcopy, td_endcopy)); - - if (scope_sys) { - bzero(&newkg->kg_startzero, - __rangeof(struct ksegrp, kg_startzero, kg_endzero)); - bcopy(&kg->kg_startcopy, &newkg->kg_startcopy, - __rangeof(struct ksegrp, kg_startcopy, kg_endcopy)); - } - newtd->td_proc = td->td_proc; newtd->td_ucred = crhold(td->td_ucred); @@ -121,25 +107,53 @@ cpu_set_upcall(newtd, td); error = set_mcontext(newtd, &ctx.uc_mcontext); if (error != 0) { - if (scope_sys) - ksegrp_free(newkg); thread_free(newtd); crfree(td->td_ucred); goto out; } + if ((td->td_proc->p_flag & P_HADTHREADS) == 0) + p->p_procscopegrp = kg; + + if (scope_sys) { + newkg = ksegrp_alloc(); + bzero(&newkg->kg_startzero, + __rangeof(struct ksegrp, kg_startzero, kg_endzero)); + bcopy(&kg->kg_startcopy, &newkg->kg_startcopy, + __rangeof(struct ksegrp, kg_startcopy, kg_endcopy)); + PROC_LOCK(td->td_proc); + } else { +retry: + PROC_LOCK(td->td_proc); + if ((newkg = p->p_procscopegrp) == NULL) { + PROC_UNLOCK(p); + newkg = ksegrp_alloc(); + bzero(&newkg->kg_startzero, + __rangeof(struct ksegrp, kg_startzero, kg_endzero)); + bcopy(&kg->kg_startcopy, &newkg->kg_startcopy, + __rangeof(struct ksegrp, kg_startcopy, kg_endcopy)); + PROC_LOCK(p); + if (p->p_procscopegrp == NULL) + p->p_procscopegrp = newkg; + else { + PROC_UNLOCK(p); + ksegrp_free(newkg); + goto retry; + } + } + } + /* Link the thread and kse into the ksegrp and make it runnable. */ - PROC_LOCK(td->td_proc); if (scope_sys) { - sched_init_concurrency(newkg); + sched_init_concurrency(newkg); } else { if ((td->td_proc->p_flag & P_HADTHREADS) == 0) { - sched_set_concurrency(kg, + sched_set_concurrency(newkg, thr_concurrency ? thr_concurrency : (2*mp_ncpus)); } } - td->td_proc->p_flag |= P_HADTHREADS; + td->td_proc->p_flag |= P_HADTHREADS; newtd->td_sigmask = td->td_sigmask; mtx_lock_spin(&sched_lock); if (scope_sys) ==== //depot/projects/davidxu_thread/src/sys/kern/kern_thread.c#5 (text+ko) ==== @@ -610,6 +610,8 @@ * This is probably not fair so think of * a better answer. */ + if (kg == p->p_procscopegrp) + p->p_procscopegrp = NULL; sched_exit_ksegrp(FIRST_KSEGRP_IN_PROC(p), td); sched_set_concurrency(kg, 0); /* XXX TEMP */ ksegrp_unlink(kg); ==== //depot/projects/davidxu_thread/src/sys/sys/proc.h#7 (text+ko) ==== @@ -572,6 +572,7 @@ int p_suspcount; /* (c) Num threads in suspended mode. */ struct thread *p_xthread; /* (c) Trap thread */ int p_boundary_count;/* (c) Num threads at user boundary */ + struct ksegrp *p_procscopegrp; /* End area that is zeroed on creation. */ #define p_endzero p_magic ==== //depot/projects/davidxu_thread/src/sys/sys/thr.h#3 (text+ko) ==== @@ -30,7 +30,10 @@ #ifndef _SYS_THR_H_ #define _SYS_THR_H_ -#define THR_SUSPENDED 0x0001 /* Create the thread in the suspended state. */ +/* Create the thread in the suspended state. */ +#define THR_SUSPENDED 0x0001 +/* Create the system scope thread. */ +#define THR_SYSTEM_SCOPE 0x0002 /* * See pthread_*