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:
parent
7652321b79
commit
c2d27b0ec7
@ -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 */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user