X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fkernel%2Fio_apic.c;h=39d9a5fa907e2eb6d40f098fcac9bb6d1ce6b9ef;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=d70f2ade5cde47818a94ef3539a8d64cefb880f1;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index d70f2ade5..39d9a5fa9 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c @@ -351,8 +351,8 @@ static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold) { int i, j; Dprintk("Rotating IRQs among CPUs.\n"); - for_each_online_cpu(i) { - for (j = 0; j < NR_IRQS; j++) { + for (i = 0; i < NR_CPUS; i++) { + for (j = 0; cpu_online(i) && (j < NR_IRQS); j++) { if (!irq_desc[j].action) continue; /* Is it a significant load ? */ @@ -381,7 +381,7 @@ static void do_irq_balance(void) unsigned long imbalance = 0; cpumask_t allowed_mask, target_cpu_mask, tmp; - for_each_possible_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { int package_index; CPU_IRQ(i) = 0; if (!cpu_online(i)) @@ -422,7 +422,9 @@ static void do_irq_balance(void) } } /* Find the least loaded processor package */ - for_each_online_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_online(i)) + continue; if (i != CPU_TO_PACKAGEINDEX(i)) continue; if (min_cpu_irq > CPU_IRQ(i)) { @@ -439,7 +441,9 @@ tryanothercpu: */ tmp_cpu_irq = 0; tmp_loaded = -1; - for_each_online_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_online(i)) + continue; if (i != CPU_TO_PACKAGEINDEX(i)) continue; if (max_cpu_irq <= CPU_IRQ(i)) @@ -615,7 +619,9 @@ static int __init balanced_irq_init(void) if (smp_num_siblings > 1 && !cpus_empty(tmp)) physical_balance = 1; - for_each_online_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_online(i)) + continue; irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) { @@ -632,11 +638,9 @@ static int __init balanced_irq_init(void) else printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq"); failed: - for_each_possible_cpu(i) { + for (i = 0; i < NR_CPUS; i++) { kfree(irq_cpu_data[i].irq_delta); - irq_cpu_data[i].irq_delta = NULL; kfree(irq_cpu_data[i].last_irq); - irq_cpu_data[i].last_irq = NULL; } return 0; } @@ -644,7 +648,7 @@ failed: int __init irqbalance_disable(char *str) { irqbalance_disabled = 1; - return 1; + return 0; } __setup("noirqbalance", irqbalance_disable); @@ -1757,8 +1761,7 @@ static void __init setup_ioapic_ids_from_mpc(void) * Don't check I/O APIC IDs for xAPIC systems. They have * no meaning without the serial APIC bus. */ - if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) - || APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) + if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 < 15)) return; /* * This is broken; anything with a real cpu count has to @@ -2238,8 +2241,6 @@ static inline void unlock_ExtINT_logic(void) spin_unlock_irqrestore(&ioapic_lock, flags); } -int timer_uses_ioapic_pin_0; - /* * This code may look a bit paranoid, but it's supposed to cooperate with * a wide range of boards and BIOS bugs. Fortunately only the timer IRQ @@ -2276,9 +2277,6 @@ static inline void check_timer(void) pin2 = ioapic_i8259.pin; apic2 = ioapic_i8259.apic; - if (pin1 == 0) - timer_uses_ioapic_pin_0 = 1; - printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n", vector, apic1, pin1, apic2, pin2);