the attached, bigger patch cleans up a particular aspect of scheduler initialization that is the source of two unclean pieces of code within the timer interrupt: in idle_tick(): if ((jiffies % IDLE_REBALANCE_TICK) || likely(this_rq()->curr == NULL)) return; in scheduler_tick(): if (p == rq->idle || !rq->idle) return idle_tick(); both the 'this_rq()->curr == NULL' and '!rq->idle' tests are only there to fix a temporary bootup-only situation where the idle threads are not initialized yet. the source of the problem is that idle thread initialization on SMP is not 'atomic'. Eg., on x86 the idle threads first do timer calibration, for which period of time it's possible for timer interrupts to arrive on that (partly initialized) CPU. the attached patch solves this problem by splitting up init_idle() into two parts: init_idle() and idle_startup_done(). After init_idle() is called, it's possible to receive timer interrupts on a CPU. But schedule() can only be called after all idle threads have done idle_startup_done(). Ingo