diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/irq/manage.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index bf606a53a21c..89a3ea82569b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -282,7 +282,7 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) | |||
| 282 | { | 282 | { |
| 283 | struct irq_chip *chip = irq_desc_get_chip(desc); | 283 | struct irq_chip *chip = irq_desc_get_chip(desc); |
| 284 | struct cpumask *set = irq_default_affinity; | 284 | struct cpumask *set = irq_default_affinity; |
| 285 | int ret; | 285 | int ret, node = desc->irq_data.node; |
| 286 | 286 | ||
| 287 | /* Excludes PER_CPU and NO_BALANCE interrupts */ | 287 | /* Excludes PER_CPU and NO_BALANCE interrupts */ |
| 288 | if (!irq_can_set_affinity(irq)) | 288 | if (!irq_can_set_affinity(irq)) |
| @@ -301,6 +301,13 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) | |||
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | cpumask_and(mask, cpu_online_mask, set); | 303 | cpumask_and(mask, cpu_online_mask, set); |
| 304 | if (node != NUMA_NO_NODE) { | ||
| 305 | const struct cpumask *nodemask = cpumask_of_node(node); | ||
| 306 | |||
| 307 | /* make sure at least one of the cpus in nodemask is online */ | ||
| 308 | if (cpumask_intersects(mask, nodemask)) | ||
| 309 | cpumask_and(mask, mask, nodemask); | ||
| 310 | } | ||
| 304 | ret = chip->irq_set_affinity(&desc->irq_data, mask, false); | 311 | ret = chip->irq_set_affinity(&desc->irq_data, mask, false); |
| 305 | switch (ret) { | 312 | switch (ret) { |
| 306 | case IRQ_SET_MASK_OK: | 313 | case IRQ_SET_MASK_OK: |
