socsvn commit: r238766 - soc2012/rudot/sys/kern

rudot at FreeBSD.org rudot at FreeBSD.org
Mon Jul 2 07:33:25 UTC 2012


Author: rudot
Date: Mon Jul  2 07:33:22 2012
New Revision: 238766
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238766

Log:
  fixing of buildworld bug - work in progress

Modified:
  soc2012/rudot/sys/kern/kern_racct.c

Modified: soc2012/rudot/sys/kern/kern_racct.c
==============================================================================
--- soc2012/rudot/sys/kern/kern_racct.c	Mon Jul  2 07:31:25 2012	(r238765)
+++ soc2012/rudot/sys/kern/kern_racct.c	Mon Jul  2 07:33:22 2012	(r238766)
@@ -897,11 +897,13 @@
 {
 	struct thread *td;
 
+	PROC_LOCK_ASSERT(p, MA_OWNED);
 	FOREACH_THREAD_IN_PROC(p, td) {
+		if (td->td_critnest > 1)
+			continue;
 		if ((td->td_flags & TDF_RACCT_PCTCPU) == 0) {
 			thread_lock(td);
 			td->td_flags |= TDF_RACCT_PCTCPU;
-
 			switch (td->td_state) {
 			case TDS_RUNQ:
 				sched_rem(td);
@@ -932,6 +934,7 @@
 {
 	struct thread *td;
 
+	PROC_LOCK_ASSERT(p, MA_OWNED);
 	FOREACH_THREAD_IN_PROC(p, td) {
 		if (td->td_flags & TDF_RACCT_PCTCPU)
 			return (1);	
@@ -945,6 +948,7 @@
 {
 	struct thread *td;
 
+	PROC_LOCK_ASSERT(p, MA_OWNED);
 	FOREACH_THREAD_IN_PROC(p, td) {
 		thread_lock(td);
 		td->td_flags &= ~TDF_RACCT_PCTCPU;
@@ -970,12 +974,19 @@
 		sx_slock(&allproc_lock);
 
 		FOREACH_PROC_IN_SYSTEM(p) {
-			if (p->p_state != PRS_NORMAL)
+			PROC_LOCK(p);
+			if (p->p_state == PRS_ZOMBIE) {
+				pct = racct_getpcpu(p);
+				racct_set(p, RACCT_PCTCPU, pct);
+			}
+
+			if (p->p_state != PRS_NORMAL) {
+				PROC_UNLOCK(p);
 				continue;
+			}
 
 			microuptime(&wallclock);
 			timevalsub(&wallclock, &p->p_stats->p_start);
-			PROC_LOCK(p);
 			PROC_SLOCK(p);
 			FOREACH_THREAD_IN_PROC(p, td)
 				ruxagg(p, td);


More information about the svn-soc-all mailing list