--- /dev/null
+From 601c942176d8ad8334118bddb747e3720bed24f8 Mon Sep 17 00:00:00 2001
+From: Sudeep Holla <sudeep.holla@arm.com>
+Date: Fri, 9 May 2014 17:37:44 +0100
+Subject: arm64: use cpu_online_mask when using forced irq_set_affinity
+
+From: Sudeep Holla <sudeep.holla@arm.com>
+
+commit 601c942176d8ad8334118bddb747e3720bed24f8 upstream.
+
+Commit 01f8fa4f01d8("genirq: Allow forcing cpu affinity of interrupts")
+enabled the forced irq_set_affinity which previously refused to route an
+interrupt to an offline cpu.
+
+Commit ffde1de64012("irqchip: Gic: Support forced affinity setting")
+implements this force logic and disables the cpu online check for GIC
+interrupt controller.
+
+When __cpu_disable calls migrate_irqs, it disables the current cpu in
+cpu_online_mask and uses forced irq_set_affinity to migrate the IRQs
+away from the cpu but passes affinity mask with the cpu being offlined
+also included in it.
+
+When calling irq_set_affinity with force == true in a cpu hotplug path,
+the caller must ensure that the cpu being offlined is not present in the
+affinity mask or it may be selected as the target CPU, leading to the
+interrupt not being migrated.
+
+This patch uses cpu_online_mask when using forced irq_set_affinity so
+that the IRQs are properly migrated away.
+
+Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
+Acked-by: Mark Rutland <mark.rutland@arm.com>
+Cc: Will Deacon <will.deacon@arm.com>
+Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm64/kernel/irq.c | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+--- a/arch/arm64/kernel/irq.c
++++ b/arch/arm64/kernel/irq.c
+@@ -97,11 +97,15 @@ static bool migrate_one_irq(struct irq_d
+ if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity))
+ return false;
+
+- if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
+- affinity = cpu_online_mask;
++ if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids)
+ ret = true;
+- }
+
++ /*
++ * when using forced irq_set_affinity we must ensure that the cpu
++ * being offlined is not present in the affinity mask, it may be
++ * selected as the target CPU otherwise
++ */
++ affinity = cpu_online_mask;
+ c = irq_data_get_irq_chip(d);
+ if (!c->irq_set_affinity)
+ pr_debug("IRQ%u: unable to set affinity\n", d->irq);