Messages in this thread Patch in this message |  | | | Date | Fri, 27 May 2005 11:20:24 +0200 | | From | Ingo Molnar <> | | Subject | Re: [patch] improve SMP reschedule and idle routines |
| |
* Nick Piggin <nickpiggin@yahoo.com.au> wrote:
> >the need_resched changes are not needed meanwhile - we can do the first > >schedule() in rest_init() just fine. (See my earlier patch below.) So > >please keep the need_resched thing out of your patch. > > > > OK that's better. Sorry I didn't see your patch earlier. > > I'll redo this patch. Coming up...
Andrew: please drop the following two patches:
sched-remove-set_tsk_need_resched-from-init_idle-v2.patch sched-remove-set_tsk_need_resched-from-init_idle-v2-ia64-fix.patch
and add the one below. The only followup patch (sched-voluntary-kernel-preemption.patch) should still apply cleanly. Nick's upcoming patch can then come afterwards.
---- 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 <mingo@elte.hu> Acked-by: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@osdl.org>
--- linux/kernel/sched.c.orig +++ linux/kernel/sched.c @@ -4163,6 +4163,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); @@ -4180,7 +4188,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! */ --- linux/init/main.c.orig +++ linux/init/main.c @@ -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 once to get things moving: + */ + schedule(); + cpu_idle(); } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |