]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iavf: convert to NAPI IRQ affinity API
authorAhmed Zaki <ahmed.zaki@intel.com>
Fri, 16 May 2025 22:19:09 +0000 (16:19 -0600)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 9 Jun 2025 16:56:18 +0000 (09:56 -0700)
Commit bd7c00605ee0 ("net: move aRFS rmap management and CPU affinity
to core") allows the drivers to delegate the IRQ affinity to the NAPI
instance. However, the driver needs to use a persistent NAPI config
and explicitly set/unset the NAPI<->IRQ association.

Convert to the new IRQ affinity API.

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/iavf/iavf.h
drivers/net/ethernet/intel/iavf/iavf_main.c
drivers/net/ethernet/intel/iavf/iavf_txrx.c

index eb86cca38be2b3d7336d3b9922b1334a0d5e49db..a87e0c6d4017adf1f1cba9df7411cda8f050c6f6 100644 (file)
@@ -114,8 +114,6 @@ struct iavf_q_vector {
        u16 reg_idx;            /* register index of the interrupt */
        char name[IFNAMSIZ + 15];
        bool arm_wb_state;
-       cpumask_t affinity_mask;
-       struct irq_affinity_notify affinity_notify;
 };
 
 /* Helper macros to switch between ints/sec and what the register uses.
index 01e11ac5055b0b8046dc499b50ed21f74f20fac9..2f501c8264b4d3a2280b74d4d071c6dc3a9d56d5 100644 (file)
@@ -527,33 +527,6 @@ static void iavf_map_rings_to_vectors(struct iavf_adapter *adapter)
        adapter->aq_required |= IAVF_FLAG_AQ_MAP_VECTORS;
 }
 
-/**
- * iavf_irq_affinity_notify - Callback for affinity changes
- * @notify: context as to what irq was changed
- * @mask: the new affinity mask
- *
- * This is a callback function used by the irq_set_affinity_notifier function
- * so that we may register to receive changes to the irq affinity masks.
- **/
-static void iavf_irq_affinity_notify(struct irq_affinity_notify *notify,
-                                    const cpumask_t *mask)
-{
-       struct iavf_q_vector *q_vector =
-               container_of(notify, struct iavf_q_vector, affinity_notify);
-
-       cpumask_copy(&q_vector->affinity_mask, mask);
-}
-
-/**
- * iavf_irq_affinity_release - Callback for affinity notifier release
- * @ref: internal core kernel usage
- *
- * This is a callback function used by the irq_set_affinity_notifier function
- * to inform the current notification subscriber that they will no longer
- * receive notifications.
- **/
-static void iavf_irq_affinity_release(struct kref *ref) {}
-
 /**
  * iavf_request_traffic_irqs - Initialize MSI-X interrupts
  * @adapter: board private structure
@@ -568,7 +541,6 @@ iavf_request_traffic_irqs(struct iavf_adapter *adapter, char *basename)
        unsigned int vector, q_vectors;
        unsigned int rx_int_idx = 0, tx_int_idx = 0;
        int irq_num, err;
-       int cpu;
 
        iavf_irq_disable(adapter);
        /* Decrement for Other and TCP Timer vectors */
@@ -603,17 +575,6 @@ iavf_request_traffic_irqs(struct iavf_adapter *adapter, char *basename)
                                 "Request_irq failed, error: %d\n", err);
                        goto free_queue_irqs;
                }
-               /* register for affinity change notifications */
-               q_vector->affinity_notify.notify = iavf_irq_affinity_notify;
-               q_vector->affinity_notify.release =
-                                                  iavf_irq_affinity_release;
-               irq_set_affinity_notifier(irq_num, &q_vector->affinity_notify);
-               /* Spread the IRQ affinity hints across online CPUs. Note that
-                * get_cpu_mask returns a mask with a permanent lifetime so
-                * it's safe to use as a hint for irq_update_affinity_hint.
-                */
-               cpu = cpumask_local_spread(q_vector->v_idx, -1);
-               irq_update_affinity_hint(irq_num, get_cpu_mask(cpu));
        }
 
        return 0;
@@ -622,8 +583,6 @@ free_queue_irqs:
        while (vector) {
                vector--;
                irq_num = adapter->msix_entries[vector + NONQ_VECS].vector;
-               irq_set_affinity_notifier(irq_num, NULL);
-               irq_update_affinity_hint(irq_num, NULL);
                free_irq(irq_num, &adapter->q_vectors[vector]);
        }
        return err;
@@ -665,6 +624,7 @@ static int iavf_request_misc_irq(struct iavf_adapter *adapter)
  **/
 static void iavf_free_traffic_irqs(struct iavf_adapter *adapter)
 {
+       struct iavf_q_vector *q_vector;
        int vector, irq_num, q_vectors;
 
        if (!adapter->msix_entries)
@@ -673,10 +633,10 @@ static void iavf_free_traffic_irqs(struct iavf_adapter *adapter)
        q_vectors = adapter->num_msix_vectors - NONQ_VECS;
 
        for (vector = 0; vector < q_vectors; vector++) {
+               q_vector = &adapter->q_vectors[vector];
+               netif_napi_set_irq_locked(&q_vector->napi, -1);
                irq_num = adapter->msix_entries[vector + NONQ_VECS].vector;
-               irq_set_affinity_notifier(irq_num, NULL);
-               irq_update_affinity_hint(irq_num, NULL);
-               free_irq(irq_num, &adapter->q_vectors[vector]);
+               free_irq(irq_num, q_vector);
        }
 }
 
@@ -1847,7 +1807,7 @@ static int iavf_init_rss(struct iavf_adapter *adapter)
  **/
 static int iavf_alloc_q_vectors(struct iavf_adapter *adapter)
 {
-       int q_idx = 0, num_q_vectors;
+       int q_idx = 0, num_q_vectors, irq_num;
        struct iavf_q_vector *q_vector;
 
        num_q_vectors = adapter->num_msix_vectors - NONQ_VECS;
@@ -1857,14 +1817,15 @@ static int iavf_alloc_q_vectors(struct iavf_adapter *adapter)
                return -ENOMEM;
 
        for (q_idx = 0; q_idx < num_q_vectors; q_idx++) {
+               irq_num = adapter->msix_entries[q_idx + NONQ_VECS].vector;
                q_vector = &adapter->q_vectors[q_idx];
                q_vector->adapter = adapter;
                q_vector->vsi = &adapter->vsi;
                q_vector->v_idx = q_idx;
                q_vector->reg_idx = q_idx;
-               cpumask_copy(&q_vector->affinity_mask, cpu_possible_mask);
-               netif_napi_add_locked(adapter->netdev, &q_vector->napi,
-                                     iavf_napi_poll);
+               netif_napi_add_config_locked(adapter->netdev, &q_vector->napi,
+                                            iavf_napi_poll, q_idx);
+               netif_napi_set_irq_locked(&q_vector->napi, irq_num);
        }
 
        return 0;
@@ -5377,6 +5338,7 @@ static int iavf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_alloc_etherdev;
        }
 
+       netif_set_affinity_auto(netdev);
        SET_NETDEV_DEV(netdev, &pdev->dev);
 
        pci_set_drvdata(pdev, netdev);
index 422312b8b54a13cd15c00c14ed93bc53bfac0aae..23e786b9793d3394ad56fdf27b8947afbae71a87 100644 (file)
@@ -1648,7 +1648,8 @@ int iavf_napi_poll(struct napi_struct *napi, int budget)
                 * continue to poll, otherwise we must stop polling so the
                 * interrupt can move to the correct cpu.
                 */
-               if (!cpumask_test_cpu(cpu_id, &q_vector->affinity_mask)) {
+               if (!cpumask_test_cpu(cpu_id,
+                                     &q_vector->napi.config->affinity_mask)) {
                        /* Tell napi that we are done polling */
                        napi_complete_done(napi, work_done);