In endtsleep() and cv_timedwait_end(), a thread marked TDF_TIMEOUT may
be swapped out. Do not put such the thread directly back to the run queue. Spotted by: David Xu <davidx@viasoft.com.cn> While I am here, s/PS_TIMEOUT/TDF_TIMEOUT/.
This commit is contained in:
parent
c72f085d04
commit
133267776c
@ -612,7 +612,16 @@ cv_timedwait_end(void *arg)
|
||||
mtx_lock_spin(&sched_lock);
|
||||
if (td->td_flags & TDF_TIMEOUT) {
|
||||
td->td_flags &= ~TDF_TIMEOUT;
|
||||
setrunqueue(td);
|
||||
if (td->td_proc->p_sflag & PS_INMEM) {
|
||||
setrunqueue(td);
|
||||
maybe_resched(td);
|
||||
} else {
|
||||
td->td_state = TDS_SWAPPED;
|
||||
if ((td->td_proc->p_sflag & PS_SWAPPINGIN) == 0) {
|
||||
td->td_proc->p_sflag |= PS_SWAPINREQ;
|
||||
wakeup(&proc0);
|
||||
}
|
||||
}
|
||||
} else if (td->td_wchan != NULL) {
|
||||
if (td->td_state == TDS_SLP) /* XXXKSE */
|
||||
setrunnable(td);
|
||||
|
@ -621,12 +621,21 @@ endtsleep(arg)
|
||||
mtx_lock_spin(&sched_lock);
|
||||
/*
|
||||
* This is the other half of the synchronization with msleep()
|
||||
* described above. If the PS_TIMEOUT flag is set, we lost the
|
||||
* described above. If the TDS_TIMEOUT flag is set, we lost the
|
||||
* race and just need to put the process back on the runqueue.
|
||||
*/
|
||||
if ((td->td_flags & TDF_TIMEOUT) != 0) {
|
||||
td->td_flags &= ~TDF_TIMEOUT;
|
||||
setrunqueue(td);
|
||||
if (td->td_proc->p_sflag & PS_INMEM) {
|
||||
setrunqueue(td);
|
||||
maybe_resched(td);
|
||||
} else {
|
||||
td->td_state = TDS_SWAPPED;
|
||||
if ((td->td_proc->p_sflag & PS_SWAPPINGIN) == 0) {
|
||||
td->td_proc->p_sflag |= PS_SWAPINREQ;
|
||||
wakeup(&proc0);
|
||||
}
|
||||
}
|
||||
} else if (td->td_wchan != NULL) {
|
||||
if (td->td_state == TDS_SLP) /* XXXKSE */
|
||||
setrunnable(td);
|
||||
|
Loading…
Reference in New Issue
Block a user