From: Andi Kleen The logic is: the global variable is set to the magic value IRQBALANCE_CHECK_ARCH. It can be overwritten by a __setup function. If the magic value is still set when the irq balancer is started it asks the subarchitecture using the NO_BALANCE_IRQ macro. This is defined to a genapic field in the generic architecture, otherwise constant. Then the global variable is set and when it is true no balancing happens. Previously I had this wrong in that it always disabled it. This part should be correct, but it still doesn't seem to work. (i left the printk in there until the problem is debugged, could be removed of course) arch/i386/kernel/io_apic.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) diff -puN arch/i386/kernel/io_apic.c~irq_balance-fix-2 arch/i386/kernel/io_apic.c --- 25/arch/i386/kernel/io_apic.c~irq_balance-fix-2 2003-05-25 03:47:28.000000000 -0700 +++ 25-akpm/arch/i386/kernel/io_apic.c 2003-05-25 03:47:28.000000000 -0700 @@ -352,10 +352,16 @@ static inline void balance_irq(int cpu, unsigned long allowed_mask; unsigned int new_cpu; - if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH && NO_BALANCE_IRQ) - return; - else if (irqbalance_disabled) + if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH) + irqbalance_disabled = NO_BALANCE_IRQ; + if (irqbalance_disabled) { + static int warned; + if (warned == 0) { + printk("irqbalance disabled\n"); + warned = 1; + } return; + } allowed_mask = cpu_online_map & irq_affinity[irq]; new_cpu = move(cpu, allowed_mask, now, 1); _