|
@@ -282,7 +282,7 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
|
|
|
{
|
|
|
struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
struct cpumask *set = irq_default_affinity;
|
|
|
- int ret;
|
|
|
+ int ret, node = desc->irq_data.node;
|
|
|
|
|
|
/* Excludes PER_CPU and NO_BALANCE interrupts */
|
|
|
if (!irq_can_set_affinity(irq))
|
|
@@ -301,6 +301,13 @@ setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask)
|
|
|
}
|
|
|
|
|
|
cpumask_and(mask, cpu_online_mask, set);
|
|
|
+ if (node != NUMA_NO_NODE) {
|
|
|
+ const struct cpumask *nodemask = cpumask_of_node(node);
|
|
|
+
|
|
|
+ /* make sure at least one of the cpus in nodemask is online */
|
|
|
+ if (cpumask_intersects(mask, nodemask))
|
|
|
+ cpumask_and(mask, mask, nodemask);
|
|
|
+ }
|
|
|
ret = chip->irq_set_affinity(&desc->irq_data, mask, false);
|
|
|
switch (ret) {
|
|
|
case IRQ_SET_MASK_OK:
|