On 2014-04-11, 5:13 PM, Charlie Paul wrote:
From: David Mercado <[email protected]>Fix irq_set_affinity() to allow usage of buslocks with "slow bus" IRQ controllers, such as the LSI Axxia GIC. Otherwise, a device having its IRQ affinity changed will hang.
This is a common kernel file, so we need more explanation here. What is the overhead of this call ? What does it do to existing users of irq_set_affinity ? Generally speaking, these are routines that a BSP should never be patching. Bruce
Signed-off-by: David Mercado <[email protected]> --- kernel/irq/manage.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 9bd5c8a..81afc6d 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -195,16 +195,16 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) */ int irq_set_affinity(unsigned int irq, const struct cpumask *mask) { - struct irq_desc *desc = irq_to_desc(irq); unsigned long flags; + struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, + IRQ_GET_DESC_CHECK_GLOBAL); int ret; if (!desc) return -EINVAL; - raw_spin_lock_irqsave(&desc->lock, flags); ret = __irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask); - raw_spin_unlock_irqrestore(&desc->lock, flags); + irq_put_desc_busunlock(desc, flags); return ret; } @@ -1101,8 +1101,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) goto out_mask; } - desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | \ - IRQS_ONESHOT | IRQS_WAITING); + desc->istate &= ~(IRQS_AUTODETECT | IRQS_SPURIOUS_DISABLED | + IRQS_ONESHOT | IRQS_WAITING); irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS); if (new->flags & IRQF_PERCPU) { @@ -1134,7 +1134,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) if (nmsk != omsk) /* hope the handler works with current trigger mode */ - pr_warning("irq %d uses trigger mode %u; requested %u\n", + pr_warn("irq %d uses trigger mode %u; requested %u\n", irq, nmsk, omsk); } @@ -1313,7 +1313,7 @@ void remove_irq(unsigned int irq, struct irqaction *act) struct irq_desc *desc = irq_to_desc(irq); if (desc && !WARN_ON(irq_settings_is_per_cpu_devid(desc))) - __free_irq(irq, act->dev_id); + __free_irq(irq, act->dev_id); } EXPORT_SYMBOL_GPL(remove_irq); @@ -1595,7 +1595,7 @@ void remove_percpu_irq(unsigned int irq, struct irqaction *act) struct irq_desc *desc = irq_to_desc(irq); if (desc && irq_settings_is_per_cpu_devid(desc)) - __free_percpu_irq(irq, act->percpu_dev_id); + __free_percpu_irq(irq, act->percpu_dev_id); } /**
-- _______________________________________________ linux-yocto mailing list [email protected] https://lists.yoctoproject.org/listinfo/linux-yocto
