> 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().

Reply via email to