diff options
-rw-r--r-- | arch/x86_64/kernel/irq.c | 32 |
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 | ||