Index: linux-2.6.19-rc4-mm2/include/linux/interrupt.h =================================================================== --- linux-2.6.19-rc4-mm2.orig/include/linux/interrupt.h 2006-11-10 21:13:22.000000000 -0600 +++ linux-2.6.19-rc4-mm2/include/linux/interrupt.h 2006-11-10 22:45:29.403054884 -0600 @@ -237,6 +237,7 @@ enum NET_RX_SOFTIRQ, BLOCK_SOFTIRQ, TASKLET_SOFTIRQ, + SCHED_SOFTIRQ, #ifdef CONFIG_HIGH_RES_TIMERS HRTIMER_SOFTIRQ, #endif Index: linux-2.6.19-rc4-mm2/kernel/sched.c =================================================================== --- linux-2.6.19-rc4-mm2.orig/kernel/sched.c 2006-11-10 22:45:20.000000000 -0600 +++ linux-2.6.19-rc4-mm2/kernel/sched.c 2006-11-10 22:46:29.518549748 -0600 @@ -2857,8 +2857,7 @@ static void update_load(struct rq *this_ } /* - * rebalance_domains is triggered when needed via a tasklet from the - * scheduler tick. + * rebalance_domains is triggered when needed from the scheduler tick. * * It checks each scheduling domain to see if it is due to be balanced, * and initiates a balancing operation if so. @@ -2866,7 +2865,7 @@ static void update_load(struct rq *this_ * Balancing parameters are set up in arch_init_sched_domains. */ -static void rebalance_domains(unsigned long dummy) +static void run_rebalance_domains(struct softirq_action *h) { int this_cpu = smp_processor_id(); struct rq *this_rq = cpu_rq(this_cpu); @@ -2918,8 +2917,6 @@ static void rebalance_domains(unsigned l } this_rq->next_balance = next_balance; } - -DECLARE_TASKLET(rebalance, &rebalance_domains, 0L); #else /* * on UP we do not need to balance between CPUs: @@ -3172,7 +3169,7 @@ void scheduler_tick(void) #ifdef CONFIG_SMP update_load(rq); if (time_after_eq(jiffies, rq->next_balance)) - tasklet_schedule(&rebalance); + raise_softirq(SCHED_SOFTIRQ); #endif } @@ -6902,7 +6899,7 @@ void __init sched_init_smp(void) unlock_cpu_hotplug(); /* XXX: Theoretical race here - CPU may be hotplugged now */ hotcpu_notifier(update_sched_domains, 0); - + open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL); init_sched_domain_sysctl(); /* Move init over to a non-isolated CPU */