> Date: Thu, 4 Oct 2012 23:42:45 +0200 > From: Gregor Best <g...@ring0.de> > Index: kern/kern_sched.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_sched.c,v > retrieving revision 1.27 > diff -u -r1.27 kern_sched.c > --- kern/kern_sched.c 10 Jul 2012 18:20:37 -0000 1.27 > +++ kern/kern_sched.c 4 Oct 2012 21:27:58 -0000 > @@ -158,18 +167,17 @@ > > cpuset_add(&sched_idle_cpus, ci); > cpu_idle_enter(); > - while (spc->spc_whichqs == 0) { > - if (spc->spc_schedflags & SPCF_SHOULDHALT && > - (spc->spc_schedflags & SPCF_HALTED) == 0) { > - cpuset_del(&sched_idle_cpus, ci); > - SCHED_LOCK(s); > - atomic_setbits_int(&spc->spc_schedflags, > - spc->spc_whichqs ? 0 : SPCF_HALTED); > - SCHED_UNLOCK(s); > - wakeup(spc); > - } > - cpu_idle_cycle(); > + > + if (spc->spc_schedflags & SPCF_SHOULDHALT && > + (spc->spc_schedflags & SPCF_HALTED) == 0) { > + cpuset_del(&sched_idle_cpus, ci); > + SCHED_LOCK(s); > + atomic_setbits_int(&spc->spc_schedflags, SPCF_HALTED); > + SCHED_UNLOCK(s); > + wakeup(spc); > } > + cpu_idle_cycle(); > + > cpu_idle_leave(); > cpuset_del(&sched_idle_cpus, ci); > } > @@ -222,14 +230,13 @@
I don't think changing the idle loop like this is ok. You want to continue checking whether the runqueue is empty in between cpu_idle_enter() and cpu_idle_leave().