diff options
author | Yinghai Lu <yinghai@kernel.org> | 2009-01-31 14:50:07 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-01 11:36:31 +0100 |
commit | 10b888d6cec2688e65e9e128b14bf98ecd199da2 (patch) | |
tree | b29736b4fabe128b8a3db00b22c71e98424d03d4 /arch/x86/kernel/io_apic.c | |
parent | 9a8ecae87a2b698964b1db9ea504ba1099f479fc (diff) | |
download | lwn-10b888d6cec2688e65e9e128b14bf98ecd199da2.tar.gz lwn-10b888d6cec2688e65e9e128b14bf98ecd199da2.zip |
irq, x86: fix lock status with numa_migrate_irq_desc
Eric Paris reported:
> I have an hp dl785g5 which is unable to successfully run
> 2.6.29-0.66.rc3.fc11.x86_64 or 2.6.29-rc2-next-20090126. During bootup
> (early in userspace daemons starting) I get the below BUG, which quickly
> renders the machine dead. I assume it is because sparse_irq_lock never
> gets released when the BUG kills that task.
Adjust lock sequence when migrating a descriptor with
CONFIG_NUMA_MIGRATE_IRQ_DESC enabled.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/io_apic.c')
-rw-r--r-- | arch/x86/kernel/io_apic.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 1c4a1302536c..9b0c480c383b 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c @@ -2528,14 +2528,15 @@ static void irq_complete_move(struct irq_desc **descp) vector = ~get_irq_regs()->orig_ax; me = smp_processor_id(); + + if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) { #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC *descp = desc = move_irq_desc(desc, me); /* get the new one */ cfg = desc->chip_data; #endif - - if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) send_cleanup_vector(cfg); + } } #else static inline void irq_complete_move(struct irq_desc **descp) {} |