On 2014-04-11, 5:13 PM, Charlie Paul wrote:
From: David Mercado <david.merc...@windriver.com>

     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 <david.merc...@windriver.com>
---
  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
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to