Check for TDF_SINTR before calling sleepq_abort() as there is a narrow

race in between sleepq_add() and sleepq_catch_signals() in that setting
td_wchan and TDF_SINTR is not atomic to sched_lock but only to the sleepq
lock.  This band-aid will stop assertion failures, but there is perhaps a
larger problem with the sleepq_add/sleepq_catch_signals race that I am not
sure how to solve.  For the signals case the race is harmless because we
always call cursig() after setting TDF_SINTR.  However, KSE doesn't do
anything in sleepq_catch_signals() to check that this race was lost, so I
am unsure if this race is harmful for this specific abort.
This commit is contained in:
jhb 2004-03-01 23:07:58 +00:00
parent 1dc1bc8010
commit 86e3aa5b6c
2 changed files with 2 additions and 2 deletions

View File

@ -643,7 +643,7 @@ kse_wakeup(struct thread *td, struct kse_wakeup_args *uap)
if (ku) {
if ((td2 = ku->ku_owner) == NULL) {
panic("%s: no owner", __func__);
} else if (TD_ON_SLEEPQ(td2) &&
} else if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) &&
((td2->td_wchan == &kg->kg_completed) ||
(td2->td_wchan == &p->p_siglist &&
(ku->ku_mflags & KMF_WAITSIGEVENT)))) {

View File

@ -643,7 +643,7 @@ kse_wakeup(struct thread *td, struct kse_wakeup_args *uap)
if (ku) {
if ((td2 = ku->ku_owner) == NULL) {
panic("%s: no owner", __func__);
} else if (TD_ON_SLEEPQ(td2) &&
} else if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) &&
((td2->td_wchan == &kg->kg_completed) ||
(td2->td_wchan == &p->p_siglist &&
(ku->ku_mflags & KMF_WAITSIGEVENT)))) {