From 86e3aa5b6c69390ce4972f6a9224da23e77a9266 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 1 Mar 2004 23:07:58 +0000 Subject: 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. --- sys/kern/kern_thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sys/kern/kern_thread.c') diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index cb46e9d..037266a 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -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)))) { -- cgit v1.1