diff options
author | Noam Camus <noamc@ezchip.com> | 2013-02-28 10:07:06 +0100 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2014-06-26 08:28:25 +0200 |
commit | 7e5122190b47c2574eda26aa0bbda693b2821449 (patch) | |
tree | 1915b48d1e4738c77870222c804d48f461b627c9 | |
parent | ARC: Implement ptrace(PTRACE_GET_THREAD_AREA) (diff) | |
download | linux-7e5122190b47c2574eda26aa0bbda693b2821449.tar.xz linux-7e5122190b47c2574eda26aa0bbda693b2821449.zip |
ARC: [SMP] Fix IPI IRQ registration
Handle it just like timer. Current request_percpu_irq() would fail on
non-boot cpus and thus IRQ will remian unmasked on those cpus.
[vgupta: fix changelong]
Signed-off-by: Noam Camus <noamc@ezchip.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-rw-r--r-- | arch/arc/kernel/smp.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/arc/kernel/smp.c b/arch/arc/kernel/smp.c index cf90b6f4d3e0..c802bb500602 100644 --- a/arch/arc/kernel/smp.c +++ b/arch/arc/kernel/smp.c @@ -337,8 +337,19 @@ irqreturn_t do_IPI(int irq, void *dev_id) * API called by platform code to hookup arch-common ISR to their IPI IRQ */ static DEFINE_PER_CPU(int, ipi_dev); + +static struct irqaction arc_ipi_irq = { + .name = "IPI Interrupt", + .flags = IRQF_PERCPU, + .handler = do_IPI, +}; + int smp_ipi_irq_setup(int cpu, int irq) { - int *dev_id = &per_cpu(ipi_dev, smp_processor_id()); - return request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev_id); + if (!cpu) + return setup_irq(irq, &arc_ipi_irq); + else + arch_unmask_irq(irq); + + return 0; } |