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
This archive was generated by hypermail 2b29 : Wed Jan 23 2002 - 21:00:36 EST