From d6fb464d0d29dffe8142be9a2a23965aa7fba6ec Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Wed, 4 Oct 2006 02:16:29 -0700 Subject: [PATCH] --- yaml --- r: 38412 b: refs/heads/master c: e7b946e98a456077dd6897f726f3d6197bd7e3b9 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/irq.h | 6 ++++++ trunk/kernel/irq/migration.c | 28 +++++++++++++++++++++------- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index a17a4c1ec101..8f09841c0dee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a24ceab4f44f21749aa0b6bd38bee37c775e036f +refs/heads/master: e7b946e98a456077dd6897f726f3d6197bd7e3b9 diff --git a/trunk/include/linux/irq.h b/trunk/include/linux/irq.h index 3eab46f590a9..a31a7d8acdb2 100644 --- a/trunk/include/linux/irq.h +++ b/trunk/include/linux/irq.h @@ -205,6 +205,7 @@ static inline void set_native_irq_info(int irq, cpumask_t mask) void set_pending_irq(unsigned int irq, cpumask_t mask); void move_native_irq(int irq); +void move_masked_irq(int irq); #ifdef CONFIG_PCI_MSI /* @@ -246,6 +247,10 @@ static inline void move_native_irq(int irq) { } +static inline void move_masked_irq(int irq) +{ +} + static inline void set_pending_irq(unsigned int irq, cpumask_t mask) { } @@ -261,6 +266,7 @@ static inline void set_irq_info(int irq, cpumask_t mask) #define move_irq(x) #define move_native_irq(x) +#define move_masked_irq(x) #endif /* CONFIG_SMP */ diff --git a/trunk/kernel/irq/migration.c b/trunk/kernel/irq/migration.c index 9b234df810d0..4baa3bbcd25a 100644 --- a/trunk/kernel/irq/migration.c +++ b/trunk/kernel/irq/migration.c @@ -12,7 +12,7 @@ void set_pending_irq(unsigned int irq, cpumask_t mask) spin_unlock_irqrestore(&desc->lock, flags); } -void move_native_irq(int irq) +void move_masked_irq(int irq) { struct irq_desc *desc = irq_desc + irq; cpumask_t tmp; @@ -48,15 +48,29 @@ void move_native_irq(int irq) * when an active trigger is comming in. This could * cause some ioapics to mal-function. * Being paranoid i guess! + * + * For correct operation this depends on the caller + * masking the irqs. */ if (likely(!cpus_empty(tmp))) { - if (likely(!(desc->status & IRQ_DISABLED))) - desc->chip->disable(irq); - desc->chip->set_affinity(irq,tmp); - - if (likely(!(desc->status & IRQ_DISABLED))) - desc->chip->enable(irq); } cpus_clear(irq_desc[irq].pending_mask); } + +void move_native_irq(int irq) +{ + struct irq_desc *desc = irq_desc + irq; + + if (likely(!(desc->status & IRQ_MOVE_PENDING))) + return; + + if (likely(!(desc->status & IRQ_DISABLED))) + desc->chip->disable(irq); + + move_masked_irq(irq); + + if (likely(!(desc->status & IRQ_DISABLED))) + desc->chip->enable(irq); +} +