--- /dev/null
+From: Suresh Siddha <suresh.b.siddha@intel.com>
+Subject: x64, x2apic/intr-remap: generic irq migration support from process context
+References: fate #303948 and fate #303984
+Patch-Mainline: queued for .28
+Commit-ID: 72b1e22dfcad1daca6906148fd956ffe404bb0bc
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+
+Generic infrastructure for migrating the irq from the process context in the
+presence of CONFIG_GENERIC_PENDING_IRQ.
+
+This will be used later for migrating irq in the presence of
+interrupt-remapping.
+
+Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
+Cc: akpm@linux-foundation.org
+Cc: arjan@linux.intel.com
+Cc: andi@firstfloor.org
+Cc: ebiederm@xmission.com
+Cc: jbarnes@virtuousgeek.org
+Cc: steiner@sgi.com
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+
+---
+ include/linux/irq.h | 1 +
+ kernel/irq/manage.c | 9 ++++++++-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+Index: linux-2.6.26/include/linux/irq.h
+===================================================================
+--- linux-2.6.26.orig/include/linux/irq.h
++++ linux-2.6.26/include/linux/irq.h
+@@ -62,6 +62,7 @@ typedef void (*irq_flow_handler_t)(unsig
+ #define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */
+ #define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */
+ #define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */
++#define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */
+
+ #ifdef CONFIG_IRQ_PER_CPU
+ # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
+Index: linux-2.6.26/kernel/irq/manage.c
+===================================================================
+--- linux-2.6.26.orig/kernel/irq/manage.c
++++ linux-2.6.26/kernel/irq/manage.c
+@@ -89,7 +89,14 @@ int irq_set_affinity(unsigned int irq, c
+ set_balance_irq_affinity(irq, cpumask);
+
+ #ifdef CONFIG_GENERIC_PENDING_IRQ
+- set_pending_irq(irq, cpumask);
++ if (desc->status & IRQ_MOVE_PCNTXT) {
++ unsigned long flags;
++
++ spin_lock_irqsave(&desc->lock, flags);
++ desc->chip->set_affinity(irq, cpumask);
++ spin_unlock_irqrestore(&desc->lock, flags);
++ } else
++ set_pending_irq(irq, cpumask);
+ #else
+ desc->affinity = cpumask;
+ desc->chip->set_affinity(irq, cpumask);