From ba96d2d81635b3ec6b7581eaa194d3e5bc0e08ed Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 22 Aug 2012 20:01:38 +0000 Subject: [PATCH] Mark the idle threads as non-sleepable and also assert that an idle thread never blocks on a turnstile. --- sys/kern/sched_4bsd.c | 1 + sys/kern/sched_ule.c | 1 + sys/kern/subr_turnstile.c | 1 + 3 files changed, 3 insertions(+) diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index f7fd347f1b92..7aaf37c45fc6 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -1598,6 +1598,7 @@ sched_idletd(void *dummy) { struct pcpuidlestat *stat; + THREAD_NO_SLEEPING(); stat = DPCPU_PTR(idlestat); for (;;) { mtx_assert(&Giant, MA_NOTOWNED); diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 8ceda763348d..337477885fa5 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -2581,6 +2581,7 @@ sched_idletd(void *dummy) mtx_assert(&Giant, MA_NOTOWNED); td = curthread; tdq = TDQ_SELF(); + THREAD_NO_SLEEPING(); for (;;) { #ifdef SMP if (tdq_idled(tdq) == 0) diff --git a/sys/kern/subr_turnstile.c b/sys/kern/subr_turnstile.c index 76fb96400362..31d16fe29128 100644 --- a/sys/kern/subr_turnstile.c +++ b/sys/kern/subr_turnstile.c @@ -684,6 +684,7 @@ turnstile_wait(struct turnstile *ts, struct thread *owner, int queue) if (owner) MPASS(owner->td_proc->p_magic == P_MAGIC); MPASS(queue == TS_SHARED_QUEUE || queue == TS_EXCLUSIVE_QUEUE); + KASSERT(!TD_IS_IDLETHREAD(td), ("idle threads cannot block on locks")); /* * If the lock does not already have a turnstile, use this thread's