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:
parent
1dc1bc8010
commit
86e3aa5b6c
@ -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)))) {
|
||||
|
@ -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)))) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user