|
@@ -249,12 +249,25 @@ static int assign_irq_vector(struct irq_data *irqd, const struct cpumask *dest)
|
|
|
|
|
|
static int assign_irq_vector_any_locked(struct irq_data *irqd)
|
|
|
{
|
|
|
+ /* Get the affinity mask - either irq_default_affinity or (user) set */
|
|
|
+ const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd);
|
|
|
int node = irq_data_get_node(irqd);
|
|
|
|
|
|
- if (node != NUMA_NO_NODE) {
|
|
|
- if (!assign_vector_locked(irqd, cpumask_of_node(node)))
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ if (node == NUMA_NO_NODE)
|
|
|
+ goto all;
|
|
|
+ /* Try the intersection of @affmsk and node mask */
|
|
|
+ cpumask_and(vector_searchmask, cpumask_of_node(node), affmsk);
|
|
|
+ if (!assign_vector_locked(irqd, vector_searchmask))
|
|
|
+ return 0;
|
|
|
+ /* Try the node mask */
|
|
|
+ if (!assign_vector_locked(irqd, cpumask_of_node(node)))
|
|
|
+ return 0;
|
|
|
+all:
|
|
|
+ /* Try the full affinity mask */
|
|
|
+ cpumask_and(vector_searchmask, affmsk, cpu_online_mask);
|
|
|
+ if (!assign_vector_locked(irqd, vector_searchmask))
|
|
|
+ return 0;
|
|
|
+ /* Try the full online mask */
|
|
|
return assign_vector_locked(irqd, cpu_online_mask);
|
|
|
}
|
|
|
|