]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_11_of_41_72b1e22dfcad1daca6906148fd956ffe404bb0bc
Imported linux-2.6.27.39 suse/xen patches.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.arch / x2APIC_PATCH_11_of_41_72b1e22dfcad1daca6906148fd956ffe404bb0bc
1 From: Suresh Siddha <suresh.b.siddha@intel.com>
2 Subject: x64, x2apic/intr-remap: generic irq migration support from process context
3 References: fate #303948 and fate #303984
4 Patch-Mainline: queued for .28
5 Commit-ID: 72b1e22dfcad1daca6906148fd956ffe404bb0bc
6
7 Signed-off-by: Thomas Renninger <trenn@suse.de>
8
9 Generic infrastructure for migrating the irq from the process context in the
10 presence of CONFIG_GENERIC_PENDING_IRQ.
11
12 This will be used later for migrating irq in the presence of
13 interrupt-remapping.
14
15 Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
16 Cc: akpm@linux-foundation.org
17 Cc: arjan@linux.intel.com
18 Cc: andi@firstfloor.org
19 Cc: ebiederm@xmission.com
20 Cc: jbarnes@virtuousgeek.org
21 Cc: steiner@sgi.com
22 Signed-off-by: Ingo Molnar <mingo@elte.hu>
23
24 ---
25 include/linux/irq.h | 1 +
26 kernel/irq/manage.c | 9 ++++++++-
27 2 files changed, 9 insertions(+), 1 deletion(-)
28
29 Index: linux-2.6.26/include/linux/irq.h
30 ===================================================================
31 --- linux-2.6.26.orig/include/linux/irq.h
32 +++ linux-2.6.26/include/linux/irq.h
33 @@ -62,6 +62,7 @@ typedef void (*irq_flow_handler_t)(unsig
34 #define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */
35 #define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */
36 #define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */
37 +#define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */
38
39 #ifdef CONFIG_IRQ_PER_CPU
40 # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
41 Index: linux-2.6.26/kernel/irq/manage.c
42 ===================================================================
43 --- linux-2.6.26.orig/kernel/irq/manage.c
44 +++ linux-2.6.26/kernel/irq/manage.c
45 @@ -89,7 +89,14 @@ int irq_set_affinity(unsigned int irq, c
46 set_balance_irq_affinity(irq, cpumask);
47
48 #ifdef CONFIG_GENERIC_PENDING_IRQ
49 - set_pending_irq(irq, cpumask);
50 + if (desc->status & IRQ_MOVE_PCNTXT) {
51 + unsigned long flags;
52 +
53 + spin_lock_irqsave(&desc->lock, flags);
54 + desc->chip->set_affinity(irq, cpumask);
55 + spin_unlock_irqrestore(&desc->lock, flags);
56 + } else
57 + set_pending_irq(irq, cpumask);
58 #else
59 desc->affinity = cpumask;
60 desc->chip->set_affinity(irq, cpumask);