]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: mana: Allow irq_setup() to skip cpus for affinity
authorShradha Gupta <shradhagupta@linux.microsoft.com>
Wed, 11 Jun 2025 14:10:42 +0000 (07:10 -0700)
committerShradha Gupta <shradhagupta@linux.microsoft.com>
Tue, 17 Jun 2025 06:15:14 +0000 (06:15 +0000)
In order to prepare the MANA driver to allocate the MSI-X IRQs
dynamically, we need to enhance irq_setup() to allow skipping
affinitizing IRQs to the first CPU sibling group.

This would be for cases when the number of IRQs is less than or equal
to the number of online CPUs. In such cases for dynamically added IRQs
the first CPU sibling group would already be affinitized with HWC IRQ.

Signed-off-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Yury Norov [NVIDIA] <yury.norov@gmail.com>
drivers/net/ethernet/microsoft/mana/gdma_main.c

index 6c4e143972a1ac2ed68540122d5f321dfa85412a..6e468c0f2c401953ca02ca00a8fc871274018c61 100644 (file)
@@ -1329,7 +1329,8 @@ void mana_gd_free_res_map(struct gdma_resource *r)
  * do the same thing.
  */
 
-static int irq_setup(unsigned int *irqs, unsigned int len, int node)
+static int irq_setup(unsigned int *irqs, unsigned int len, int node,
+                    bool skip_first_cpu)
 {
        const struct cpumask *next, *prev = cpu_none_mask;
        cpumask_var_t cpus __free(free_cpumask_var);
@@ -1344,11 +1345,18 @@ static int irq_setup(unsigned int *irqs, unsigned int len, int node)
                while (weight > 0) {
                        cpumask_andnot(cpus, next, prev);
                        for_each_cpu(cpu, cpus) {
+                               cpumask_andnot(cpus, cpus, topology_sibling_cpumask(cpu));
+                               --weight;
+
+                               if (unlikely(skip_first_cpu)) {
+                                       skip_first_cpu = false;
+                                       continue;
+                               }
+
                                if (len-- == 0)
                                        goto done;
+
                                irq_set_affinity_and_hint(*irqs++, topology_sibling_cpumask(cpu));
-                               cpumask_andnot(cpus, cpus, topology_sibling_cpumask(cpu));
-                               --weight;
                        }
                }
                prev = next;
@@ -1444,7 +1452,7 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev)
                }
        }
 
-       err = irq_setup(irqs, (nvec - start_irq_index), gc->numa_node);
+       err = irq_setup(irqs, nvec - start_irq_index, gc->numa_node, false);
        if (err)
                goto free_irq;