Date: Sat, 13 Oct 2007 12:44:49 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 127474 for review Message-ID: <200710131244.l9DCinft003101@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200710131244.l9DCinft003101>