sched_4bsd: Fix a racy thread state modification

When a thread switching off-CPU is migrating to a remote CPU,
sched_switch() may trigger a rescheduling of the thread currently
running on that CPU.  When doing so, it must ensure that that thread is
locked before modifying thread state.  If the thread's lock is not the
scheduler lock, then the thread is in the process of switching off-CPU
and no extra effort is needed, and the initiator does not hold the
thread's lock and thus should not modify any thread state.

Reported and tested by:	Steve Kargl
MFC after:	1 week
This commit is contained in:
Mark Johnston 2022-09-23 19:41:30 -04:00
parent 7652321b79
commit c2d27b0ec7

View File

@ -1282,9 +1282,10 @@ kick_other_cpu(int pri, int cpuid)
}
#endif /* defined(IPI_PREEMPTION) && defined(PREEMPTION) */
ast_sched_locked(pcpu->pc_curthread, TDA_SCHED);
ipi_cpu(cpuid, IPI_AST);
return;
if (pcpu->pc_curthread->td_lock == &sched_lock) {
ast_sched_locked(pcpu->pc_curthread, TDA_SCHED);
ipi_cpu(cpuid, IPI_AST);
}
}
#endif /* SMP */