diff options
Diffstat (limited to 'kernel/irq')
-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: |