summaryrefslogtreecommitdiffstats
path: root/kernel/irq/migration.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-02-23 04:46:20 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-26 10:34:08 -0800
commit2a786b452eba900324c29a8fcf5c96d5b1c01000 (patch)
tree4b19d0c6b9dff736051448bee81ae274088dd701 /kernel/irq/migration.c
parent610142927b5bc149da92b03c7ab08b8b5f205b74 (diff)
downloadkernel-crypto-2a786b452eba900324c29a8fcf5c96d5b1c01000.tar.gz
kernel-crypto-2a786b452eba900324c29a8fcf5c96d5b1c01000.tar.xz
kernel-crypto-2a786b452eba900324c29a8fcf5c96d5b1c01000.zip
[PATCH] genirq: Mask irqs when migrating them.
move_native_irqs tries to do the right thing when migrating irqs by disabling them. However disabling them is a software logical thing, not a hardware thing. This has always been a little flaky and after Ingo's latest round of changes it is guaranteed to not mask the apic. So this patch fixes move_native_irq to directly call the mask and unmask chip methods to guarantee that we mask the irq when we are migrating it. We must do this as it is required by all code that call into the path. Since we don't know the masked status when IRQ_DISABLED is set so we will not be able to restore it. The patch makes the code just give up and trying again the next time this routing is called. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/irq/migration.c')
-rw-r--r--kernel/irq/migration.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c
index 4baa3bbcd25..77b7acc875c 100644
--- a/kernel/irq/migration.c
+++ b/kernel/irq/migration.c
@@ -65,12 +65,11 @@ void move_native_irq(int irq)
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
return;
- if (likely(!(desc->status & IRQ_DISABLED)))
- desc->chip->disable(irq);
+ if (unlikely(desc->status & IRQ_DISABLED))
+ return;
+ desc->chip->mask(irq);
move_masked_irq(irq);
-
- if (likely(!(desc->status & IRQ_DISABLED)))
- desc->chip->enable(irq);
+ desc->chip->unmask(irq);
}