Index: linux-2.6.19-rc2-mm1/kernel/sched.c =================================================================== --- linux-2.6.19-rc2-mm1.orig/kernel/sched.c 2006-10-17 22:12:52.170884511 -0500 +++ linux-2.6.19-rc2-mm1/kernel/sched.c 2006-10-17 22:25:48.214844066 -0500 @@ -1608,9 +1608,10 @@ void fastcall sched_fork(struct task_str * runqueue lock is not a problem. */ current->time_slice = 1; + local_irq_enable(); scheduler_tick(); - } - local_irq_enable(); + } else + local_irq_enable(); put_cpu(); } @@ -3040,7 +3041,8 @@ void account_steal_time(struct task_stru /* * This function gets called by the timer code, with HZ frequency. - * We call it with interrupts disabled. + * We call it with interrupts enabled. However, the thread is + * pinned to a specific cpu. * * It also gets called by the fork code, when changing the parent's * timeslices. Index: linux-2.6.19-rc2-mm1/kernel/timer.c =================================================================== --- linux-2.6.19-rc2-mm1.orig/kernel/timer.c 2006-10-17 22:13:04.761805079 -0500 +++ linux-2.6.19-rc2-mm1/kernel/timer.c 2006-10-17 22:13:09.640152430 -0500 @@ -1212,9 +1212,7 @@ static void update_wall_time(void) static void sched_tick_action(unsigned long dummy) { - local_irq_disable(); scheduler_tick(); - local_irq_enable(); } static DECLARE_TASKLET(scheduler_tick_tasklet, sched_tick_action, 0);