From: Ingo Molnar This patch tweaks idle thread setup semantics a bit: instead of setting NEED_RESCHED in init_idle(), we do an explicit schedule() before calling into cpu_idle(). This patch, while having no negative side-effects, enables wider use of cond_resched()s. (which might happen in the stock kernel too, but it's particulary important for voluntary-preempt) Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton --- init/main.c | 7 +++++++ kernel/sched.c | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff -puN init/main.c~sched-tweak-idle-thread-setup-semantics init/main.c --- 25/init/main.c~sched-tweak-idle-thread-setup-semantics 2005-05-31 02:45:59.000000000 -0700 +++ 25-akpm/init/main.c 2005-05-31 02:45:59.000000000 -0700 @@ -383,6 +383,13 @@ static void noinline rest_init(void) numa_default_policy(); unlock_kernel(); preempt_enable_no_resched(); + + /* + * The boot idle thread must execute schedule() + * at least one to get things moving: + */ + schedule(); + cpu_idle(); } diff -puN kernel/sched.c~sched-tweak-idle-thread-setup-semantics kernel/sched.c --- 25/kernel/sched.c~sched-tweak-idle-thread-setup-semantics 2005-05-31 02:45:59.000000000 -0700 +++ 25-akpm/kernel/sched.c 2005-05-31 02:45:59.000000000 -0700 @@ -4240,6 +4240,14 @@ void show_state(void) read_unlock(&tasklist_lock); } +/** + * init_idle - set up an idle thread for a given CPU + * @idle: task in question + * @cpu: cpu the idle task belongs to + * + * NOTE: this function does not set the idle thread's NEED_RESCHED + * flag, to make booting more robust. + */ void __devinit init_idle(task_t *idle, int cpu) { runqueue_t *rq = cpu_rq(cpu); @@ -4257,7 +4265,6 @@ void __devinit init_idle(task_t *idle, i #if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW) idle->oncpu = 1; #endif - set_tsk_need_resched(idle); spin_unlock_irqrestore(&rq->lock, flags); /* Set the preempt count _outside_ the spinlocks! */ _