| From f229006ec6beabf7b844653d92fa61f025fe3dcf Mon Sep 17 00:00:00 2001 |
| From: James Hogan <james.hogan@imgtec.com> |
| Date: Tue, 25 Feb 2014 22:05:35 +0000 |
| Subject: irq-metag*: stop set_affinity vectoring to offline cpus |
| |
| From: James Hogan <james.hogan@imgtec.com> |
| |
| commit f229006ec6beabf7b844653d92fa61f025fe3dcf upstream. |
| |
| Fix irq_set_affinity callbacks in the Meta IRQ chip drivers to AND |
| cpu_online_mask into the cpumask when picking a CPU to vector the |
| interrupt to. |
| |
| As Thomas pointed out, the /proc/irq/$N/smp_affinity interface doesn't |
| filter out offline CPUs, so without this patch if you offline CPU0 and |
| set an IRQ affinity to 0x3 it vectors the interrupt onto CPU0 even |
| though it is offline. |
| |
| Reported-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: James Hogan <james.hogan@imgtec.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: linux-metag@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/irqchip/irq-metag-ext.c | 2 +- |
| drivers/irqchip/irq-metag.c | 2 +- |
| 2 files changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/irqchip/irq-metag-ext.c |
| +++ b/drivers/irqchip/irq-metag-ext.c |
| @@ -515,7 +515,7 @@ static int meta_intc_set_affinity(struct |
| * one cpu (the interrupt code doesn't support it), so we just |
| * pick the first cpu we find in 'cpumask'. |
| */ |
| - cpu = cpumask_any(cpumask); |
| + cpu = cpumask_any_and(cpumask, cpu_online_mask); |
| thread = cpu_2_hwthread_id[cpu]; |
| |
| metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR2(thread)), vec_addr); |
| --- a/drivers/irqchip/irq-metag.c |
| +++ b/drivers/irqchip/irq-metag.c |
| @@ -201,7 +201,7 @@ static int metag_internal_irq_set_affini |
| * one cpu (the interrupt code doesn't support it), so we just |
| * pick the first cpu we find in 'cpumask'. |
| */ |
| - cpu = cpumask_any(cpumask); |
| + cpu = cpumask_any_and(cpumask, cpu_online_mask); |
| thread = cpu_2_hwthread_id[cpu]; |
| |
| metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR1(thread)), |