PERFORCE change 127474 for review
Marko Zec
zec at FreeBSD.org
Sat Oct 13 05:44:50 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127474
Change 127474 by zec at 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);
More information about the p4-projects
mailing list