diff options
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index e4e0ddcb154..eb2789c3f72 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -36,6 +36,7 @@  #include <linux/freezer.h>  #include <linux/kthread.h>  #include <linux/jiffies.h>	/* time_after() */ +#include <linux/slab.h>  #ifdef CONFIG_ACPI  #include <acpi/acpi_bus.h>  #endif @@ -1268,6 +1269,14 @@ void __setup_vector_irq(int cpu)  	/* Mark the inuse vectors */  	for_each_irq_desc(irq, desc) {  		cfg = desc->chip_data; + +		/* +		 * If it is a legacy IRQ handled by the legacy PIC, this cpu +		 * will be part of the irq_cfg's domain. +		 */ +		if (irq < legacy_pic->nr_legacy_irqs && !IO_APIC_IRQ(irq)) +			cpumask_set_cpu(cpu, cfg->domain); +  		if (!cpumask_test_cpu(cpu, cfg->domain))  			continue;  		vector = cfg->vector; @@ -2536,6 +2545,9 @@ void irq_force_complete_move(int irq)  	struct irq_desc *desc = irq_to_desc(irq);  	struct irq_cfg *cfg = desc->chip_data; +	if (!cfg) +		return; +  	__irq_complete_move(&desc, cfg->vector);  }  #else  |