diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/irq/migration.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 9b234df810d0..4baa3bbcd25a 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
@@ -12,7 +12,7 @@ void set_pending_irq(unsigned int irq, cpumask_t mask) | |||
12 | spin_unlock_irqrestore(&desc->lock, flags); | 12 | spin_unlock_irqrestore(&desc->lock, flags); |
13 | } | 13 | } |
14 | 14 | ||
15 | void move_native_irq(int irq) | 15 | void move_masked_irq(int irq) |
16 | { | 16 | { |
17 | struct irq_desc *desc = irq_desc + irq; | 17 | struct irq_desc *desc = irq_desc + irq; |
18 | cpumask_t tmp; | 18 | cpumask_t tmp; |
@@ -48,15 +48,29 @@ void move_native_irq(int irq) | |||
48 | * when an active trigger is comming in. This could | 48 | * when an active trigger is comming in. This could |
49 | * cause some ioapics to mal-function. | 49 | * cause some ioapics to mal-function. |
50 | * Being paranoid i guess! | 50 | * Being paranoid i guess! |
51 | * | ||
52 | * For correct operation this depends on the caller | ||
53 | * masking the irqs. | ||
51 | */ | 54 | */ |
52 | if (likely(!cpus_empty(tmp))) { | 55 | if (likely(!cpus_empty(tmp))) { |
53 | if (likely(!(desc->status & IRQ_DISABLED))) | ||
54 | desc->chip->disable(irq); | ||
55 | |||
56 | desc->chip->set_affinity(irq,tmp); | 56 | desc->chip->set_affinity(irq,tmp); |
57 | |||
58 | if (likely(!(desc->status & IRQ_DISABLED))) | ||
59 | desc->chip->enable(irq); | ||
60 | } | 57 | } |
61 | cpus_clear(irq_desc[irq].pending_mask); | 58 | cpus_clear(irq_desc[irq].pending_mask); |
62 | } | 59 | } |
60 | |||
61 | void move_native_irq(int irq) | ||
62 | { | ||
63 | struct irq_desc *desc = irq_desc + irq; | ||
64 | |||
65 | if (likely(!(desc->status & IRQ_MOVE_PENDING))) | ||
66 | return; | ||
67 | |||
68 | if (likely(!(desc->status & IRQ_DISABLED))) | ||
69 | desc->chip->disable(irq); | ||
70 | |||
71 | move_masked_irq(irq); | ||
72 | |||
73 | if (likely(!(desc->status & IRQ_DISABLED))) | ||
74 | desc->chip->enable(irq); | ||
75 | } | ||
76 | |||