diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-10-21 18:37:02 +0200 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-10-21 18:37:02 +0200 |
commit | 6bf2dafad18c119beb534cbb3d882fe7a6c3f529 (patch) | |
tree | c78450df76c5c624788aaf81154f1f2070bcd5a7 /arch/x86_64/kernel | |
parent | a1bae67243512ca30ceda48e3e24e25b543f8ab7 (diff) | |
download | blackbird-op-linux-6bf2dafad18c119beb534cbb3d882fe7a6c3f529.tar.gz blackbird-op-linux-6bf2dafad18c119beb534cbb3d882fe7a6c3f529.zip |
[PATCH] x86-64: Use irq_domain in ioapic_retrigger_irq
Thanks to YH Lu for spotting this. It appears I missed this function when I
refactored allocate_irq_vector and introduced irq_domain, with the result that
all retriggered irqs would go to cpu 0 even if we were not prepared to receive
them there.
While reviewing YH's patch I also noticed that this function was missing
locking, and since I am now reading two values from two diffrent arrays that
looks like a race we might be able to hit in the real world.
Cc: Yinghai Lu <yinghai.lu@amd.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/x86_64/kernel')
-rw-r--r-- | arch/x86_64/kernel/io_apic.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index b848f4808510..8a9a357875b7 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c @@ -1255,12 +1255,15 @@ static int ioapic_retrigger_irq(unsigned int irq) { cpumask_t mask; unsigned vector; + unsigned long flags; + spin_lock_irqsave(&vector_lock, flags); vector = irq_vector[irq]; cpus_clear(mask); - cpu_set(vector >> 8, mask); + cpu_set(first_cpu(irq_domain[irq]), mask); - send_IPI_mask(mask, vector & 0xff); + send_IPI_mask(mask, vector); + spin_unlock_irqrestore(&vector_lock, flags); return 1; } |