svn commit: r357050 - head/sys/kern

Mark Johnston markj at FreeBSD.org
Thu Jan 23 16:24:52 UTC 2020


Author: markj
Date: Thu Jan 23 16:24:51 2020
New Revision: 357050
URL: https://svnweb.freebsd.org/changeset/base/357050

Log:
  Set td_oncpu before dropping the thread lock during a switch.
  
  After r355784 we no longer hold a thread's thread lock when switching it
  out.  Preserve the previous synchronization protocol for td_oncpu by
  setting it together with td_state, before dropping the thread lock
  during a switch.
  
  Reported and tested by:	pho
  Reviewed by:	kib
  Discussed with:	jeff
  Differential Revision:	https://reviews.freebsd.org/D23270

Modified:
  head/sys/kern/sched_ule.c

Modified: head/sys/kern/sched_ule.c
==============================================================================
--- head/sys/kern/sched_ule.c	Thu Jan 23 16:10:38 2020	(r357049)
+++ head/sys/kern/sched_ule.c	Thu Jan 23 16:24:51 2020	(r357050)
@@ -2121,6 +2121,7 @@ sched_switch(struct thread *td, int flags)
 	 */
 	TDQ_LOCK_ASSERT(tdq, MA_OWNED | MA_NOTRECURSED);
 	newtd = choosethread();
+	newtd->td_oncpu = cpuid;
 	sched_pctcpu_update(td_get_sched(newtd), 0);
 	TDQ_UNLOCK(tdq);
 
@@ -2145,7 +2146,6 @@ sched_switch(struct thread *td, int flags)
 #endif
 		td->td_oncpu = NOCPU;
 		cpu_switch(td, newtd, mtx);
-		cpuid = td->td_oncpu = PCPU_GET(cpuid);
 
 		SDT_PROBE0(sched, , , on__cpu);
 #ifdef	HWPMC_HOOKS
@@ -2915,6 +2915,7 @@ sched_throw(struct thread *td)
 		thread_lock_block(td);
 	}
 	newtd = choosethread();
+	newtd->td_oncpu = PCPU_GET(cpuid);
 	spinlock_enter();
 	TDQ_UNLOCK(tdq);
 	KASSERT(curthread->td_md.md_spinlock_count == 1,


More information about the svn-src-all mailing list