svn commit: r248298 - head/sys/kern

Edward Tomasz Napierala trasz at FreeBSD.org
Thu Mar 14 23:20:19 UTC 2013


Author: trasz
Date: Thu Mar 14 23:20:18 2013
New Revision: 248298
URL: http://svnweb.freebsd.org/changeset/base/248298

Log:
  Accessing td_state requires thread lock to be held.
  
  Submitted by:	Rudo Tomori
  Reviewed by:	kib

Modified:
  head/sys/kern/kern_racct.c

Modified: head/sys/kern/kern_racct.c
==============================================================================
--- head/sys/kern/kern_racct.c	Thu Mar 14 23:14:47 2013	(r248297)
+++ head/sys/kern/kern_racct.c	Thu Mar 14 23:20:18 2013	(r248298)
@@ -1033,6 +1033,7 @@ racct_proc_throttle(struct proc *p)
 	p->p_throttled = 1;
 
 	FOREACH_THREAD_IN_PROC(p, td) {
+		thread_lock(td);
 		switch (td->td_state) {
 		case TDS_RUNQ:
 			/*
@@ -1041,27 +1042,24 @@ racct_proc_throttle(struct proc *p)
 			 * TDF_NEEDRESCHED for the thread, so that once it is
 			 * running, it is taken off the cpu as soon as possible.
 			 */
-			thread_lock(td);
 			td->td_flags |= TDF_NEEDRESCHED;
-			thread_unlock(td);
 			break;
 		case TDS_RUNNING:
 			/*
 			 * If the thread is running, we request a context
 			 * switch for it by setting the TDF_NEEDRESCHED flag.
 			 */
-			thread_lock(td);
 			td->td_flags |= TDF_NEEDRESCHED;
 #ifdef SMP
 			cpuid = td->td_oncpu;
 			if ((cpuid != NOCPU) && (td != curthread))
 				ipi_cpu(cpuid, IPI_AST);
 #endif
-			thread_unlock(td);
 			break;
 		default:
 			break;
 		}
+		thread_unlock(td);
 	}
 }
 


More information about the svn-src-all mailing list