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 | ||
