summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r--sys/kern/kern_sched.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c
index 15d57cf037c..6066c6a92f4 100644
--- a/sys/kern/kern_sched.c
+++ b/sys/kern/kern_sched.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sched.c,v 1.14 2009/10/05 17:43:08 deraadt Exp $ */
+/* $OpenBSD: kern_sched.c,v 1.15 2009/11/25 11:01:14 kettenis Exp $ */
/*
* Copyright (c) 2007, 2008 Artur Grabowski <art@openbsd.org>
*
@@ -146,6 +146,11 @@ sched_idle(void *v)
splassert(IPL_NONE);
+ if (spc->spc_schedflags & SPCF_SHOULDHALT) {
+ spc->spc_schedflags |= SPCF_HALTED;
+ wakeup(spc);
+ }
+
cpuset_add(&sched_idle_cpus, ci);
cpu_idle_enter();
while (spc->spc_whichqs == 0)
@@ -246,6 +251,13 @@ sched_chooseproc(void)
SCHED_ASSERT_LOCKED();
+ if (spc->spc_schedflags & SPCF_SHOULDHALT) {
+ p = spc->spc_idleproc;
+ KASSERT(p);
+ p->p_stat = SRUN;
+ return (p);
+ }
+
again:
if (spc->spc_whichqs) {
queue = ffs(spc->spc_whichqs) - 1;