Skip site navigation (1)Skip section navigation (2)
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>