aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/kernel/irq.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c
index 3eaceac32481..39cb3fa83ebb 100644
--- a/arch/x86_64/kernel/irq.c
+++ b/arch/x86_64/kernel/irq.c
@@ -144,17 +144,43 @@ void fixup_irqs(cpumask_t map)
144 144
145 for (irq = 0; irq < NR_IRQS; irq++) { 145 for (irq = 0; irq < NR_IRQS; irq++) {
146 cpumask_t mask; 146 cpumask_t mask;
147 int break_affinity = 0;
148 int set_affinity = 1;
149
147 if (irq == 2) 150 if (irq == 2)
148 continue; 151 continue;
149 152
153 /* interrupt's are disabled at this point */
154 spin_lock(&irq_desc[irq].lock);
155
156 if (!irq_has_action(irq) ||
157 cpus_equal(irq_desc[irq].affinity, map)) {
158 spin_unlock(&irq_desc[irq].lock);
159 continue;
160 }
161
150 cpus_and(mask, irq_desc[irq].affinity, map); 162 cpus_and(mask, irq_desc[irq].affinity, map);
151 if (any_online_cpu(mask) == NR_CPUS) { 163 if (cpus_empty(mask)) {
152 printk("Breaking affinity for irq %i\n", irq); 164 break_affinity = 1;
153 mask = map; 165 mask = map;
154 } 166 }
167
168 if (irq_desc[irq].chip->mask)
169 irq_desc[irq].chip->mask(irq);
170
155 if (irq_desc[irq].chip->set_affinity) 171 if (irq_desc[irq].chip->set_affinity)
156 irq_desc[irq].chip->set_affinity(irq, mask); 172 irq_desc[irq].chip->set_affinity(irq, mask);
157 else if (irq_desc[irq].action && !(warned++)) 173 else if (!(warned++))
174 set_affinity = 0;
175
176 if (irq_desc[irq].chip->unmask)
177 irq_desc[irq].chip->unmask(irq);
178
179 spin_unlock(&irq_desc[irq].lock);
180
181 if (break_affinity && set_affinity)
182 printk("Broke affinity for irq %i\n", irq);
183 else if (!set_affinity)
158 printk("Cannot set affinity for irq %i\n", irq); 184 printk("Cannot set affinity for irq %i\n", irq);
159 } 185 }
160 186