From owner-p4-projects@FreeBSD.ORG Sat Oct 13 12:44:50 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EDDC816A421; Sat, 13 Oct 2007 12:44:49 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 91BD416A419 for ; Sat, 13 Oct 2007 12:44:49 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 7F38613C45A for ; Sat, 13 Oct 2007 12:44:49 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l9DCin1K003104 for ; Sat, 13 Oct 2007 12:44:49 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l9DCinft003101 for perforce@freebsd.org; Sat, 13 Oct 2007 12:44:49 GMT (envelope-from zec@FreeBSD.org) Date: Sat, 13 Oct 2007 12:44:49 GMT Message-Id: <200710131244.l9DCinft003101@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@FreeBSD.org using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 127474 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Oct 2007 12:44:50 -0000 http://perforce.freebsd.org/chv.cgi?CH=127474 Change 127474 by zec@zec_tpx32 on 2007/10/13 12:44:05 Attempt to fix per vprocg load accounting, which was not properly dealing with deaths of orphaned processes, if those would be running in a non-default vprocg. Affected files ... .. //depot/projects/vimage/src/sys/kern/kern_clock.c#8 edit .. //depot/projects/vimage/src/sys/kern/kern_exit.c#9 edit .. //depot/projects/vimage/src/sys/kern/kern_fork.c#11 edit .. //depot/projects/vimage/src/sys/kern/kern_vimage.c#41 edit .. //depot/projects/vimage/src/sys/sys/sched.h#6 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/kern_clock.c#8 (text+ko) ==== @@ -416,7 +416,7 @@ td = curthread; p = td->td_proc; #ifdef VIMAGE - INIT_VPROCG(p->p_ucred->cr_rvimage->v_procg); + INIT_VPROCG(p->p_ucred->cr_vimage->v_procg); struct vprocg *vprocg_iter; #endif ==== //depot/projects/vimage/src/sys/kern/kern_exit.c#9 (text+ko) ==== @@ -175,30 +175,6 @@ KASSERT(p->p_numthreads == 1, ("exit1: proc %p exiting with %d threads", p, p->p_numthreads)); -#ifdef VIMAGE - /* XXX is PROC_UNLOCK()/PROC_LOCK() sequence safe here? */ - if (p->p_ucred->cr_vimage->v_procg != - p->p_pptr->p_ucred->cr_vimage->v_procg) { - struct ucred *oldcred; - - setsugid(p); - crhold(p->p_pptr->p_ucred); - oldcred = p->p_ucred; - p->p_ucred = p->p_pptr->p_ucred; - PROC_UNLOCK(p); - sx_xlock(&allproc_lock); -#ifdef SCHED_4BSD - sched_load_reassign(oldcred->cr_vimage->v_procg, - p->p_ucred->cr_vimage->v_procg); -#endif - oldcred->cr_vimage->v_procg->nprocs--; - p->p_ucred->cr_vimage->v_procg->nprocs++; - sx_xunlock(&allproc_lock); - PROC_LOCK(p); - crfree(oldcred); - } -#endif - /* * Wakeup anyone in procfs' PIOCWAIT. They should have a hold * on our vmspace, so we should block below until they have @@ -438,6 +414,15 @@ LIST_REMOVE(p, p_list); LIST_INSERT_HEAD(&zombproc, p, p_list); LIST_REMOVE(p, p_hash); +#if defined(VIMAGE) && defined(SCHED_4BSD) + if (p->p_ucred->cr_vimage->v_procg != + p->p_pptr->p_ucred->cr_vimage->v_procg) { + mtx_lock_spin(&sched_lock); + sched_load_reassign(p->p_ucred->cr_vimage->v_procg, + p->p_pptr->p_ucred->cr_vimage->v_procg); + mtx_unlock_spin(&sched_lock); + } +#endif sx_xunlock(&allproc_lock); /* @@ -741,7 +726,7 @@ PROC_SLOCK(p); if (p->p_state == PRS_ZOMBIE) { #ifdef VIMAGE - struct vimage *rvp = p->p_ucred->cr_rvimage; + struct vimage *vp = p->p_ucred->cr_vimage; #endif if (rusage) { *rusage = p->p_ru; @@ -831,7 +816,7 @@ sx_xlock(&allproc_lock); nprocs--; #ifdef VIMAGE - rvp->v_procg->nprocs--; + vp->v_procg->nprocs--; #endif sx_xunlock(&allproc_lock); return (0); ==== //depot/projects/vimage/src/sys/kern/kern_fork.c#11 (text+ko) ==== @@ -326,7 +326,7 @@ */ nprocs++; #ifdef VIMAGE - p1->p_ucred->cr_rvimage->v_procg->nprocs++; + p1->p_ucred->cr_vimage->v_procg->nprocs++; #endif /* ==== //depot/projects/vimage/src/sys/kern/kern_vimage.c#41 (text+ko) ==== @@ -530,8 +530,14 @@ sx_xlock(&allproc_lock); oldcred->cr_vimage->v_procg->nprocs--; p->p_ucred->cr_vimage->v_procg->nprocs++; +#if defined(VIMAGE) && defined(SCHED_4BSD) + mtx_lock_spin(&sched_lock); +#endif sched_load_reassign(oldcred->cr_vimage->v_procg, newcred->cr_vimage->v_procg); +#if defined(VIMAGE) && defined(SCHED_4BSD) + mtx_unlock_spin(&sched_lock); +#endif sx_xunlock(&allproc_lock); crfree(oldcred); break; ==== //depot/projects/vimage/src/sys/sys/sched.h#6 (text+ko) ==== @@ -179,6 +179,8 @@ #define SCHED_STAT_INC(var) #endif +extern struct mtx sched_lock; + /* temporarily here */ void schedinit(void); void sched_newproc(struct proc *p, struct thread *td);