]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
eth: fbnic: request ops lock
authorJakub Kicinski <kuba@kernel.org>
Mon, 1 Sep 2025 21:12:05 +0000 (14:12 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 4 Sep 2025 08:19:17 +0000 (10:19 +0200)
We'll add queue ops soon so. queue ops will opt the driver into
extra locking. Request this locking explicitly already to make
future patches smaller and easier to review.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20250901211214.1027927-6-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
drivers/net/ethernet/meta/fbnic/fbnic_pci.c
drivers/net/ethernet/meta/fbnic/fbnic_txrx.c

index 6dac42ca28c604fca18698ae3ee2919ae97e799f..71f9fae99168fd53a8217b71e2a735c6294802ed 100644 (file)
@@ -714,6 +714,8 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd)
 
        fbnic_set_ethtool_ops(netdev);
 
+       netdev->request_ops_lock = true;
+
        fbn = netdev_priv(netdev);
 
        fbn->netdev = netdev;
index a4db97652fb4dcc92f2939ac78559c23ec8752be..9fdc8f4f36cc69a38545c37579e31368e00010c9 100644 (file)
@@ -206,8 +206,11 @@ static void fbnic_service_task(struct work_struct *work)
 
        fbnic_bmc_rpc_check(fbd);
 
-       if (netif_carrier_ok(fbd->netdev))
+       if (netif_carrier_ok(fbd->netdev)) {
+               netdev_lock(fbd->netdev);
                fbnic_napi_depletion_check(fbd->netdev);
+               netdev_unlock(fbd->netdev);
+       }
 
        if (netif_running(fbd->netdev))
                schedule_delayed_work(&fbd->service_task, HZ);
@@ -391,12 +394,14 @@ static int fbnic_pm_suspend(struct device *dev)
                goto null_uc_addr;
 
        rtnl_lock();
+       netdev_lock(netdev);
 
        netif_device_detach(netdev);
 
        if (netif_running(netdev))
                netdev->netdev_ops->ndo_stop(netdev);
 
+       netdev_unlock(netdev);
        rtnl_unlock();
 
 null_uc_addr:
@@ -461,10 +466,12 @@ static int __fbnic_pm_resume(struct device *dev)
        fbnic_reset_queues(fbn, fbn->num_tx_queues, fbn->num_rx_queues);
 
        rtnl_lock();
+       netdev_lock(netdev);
 
        if (netif_running(netdev))
                err = __fbnic_open(fbn);
 
+       netdev_unlock(netdev);
        rtnl_unlock();
        if (err)
                goto err_free_mbx;
index 8dbe83bc2be15aee3f91c365aeaab13a78300315..dc0735b20739e92741defdcdf93d29408522fdff 100644 (file)
@@ -1501,7 +1501,7 @@ static void fbnic_free_napi_vector(struct fbnic_net *fbn,
        }
 
        fbnic_napi_free_irq(fbd, nv);
-       netif_napi_del(&nv->napi);
+       netif_napi_del_locked(&nv->napi);
        fbn->napi[fbnic_napi_idx(nv)] = NULL;
        kfree(nv);
 }
@@ -1611,11 +1611,12 @@ static int fbnic_alloc_napi_vector(struct fbnic_dev *fbd, struct fbnic_net *fbn,
 
        /* Tie napi to netdev */
        fbn->napi[fbnic_napi_idx(nv)] = nv;
-       netif_napi_add(fbn->netdev, &nv->napi, fbnic_poll);
+       netif_napi_add_locked(fbn->netdev, &nv->napi, fbnic_poll);
 
        /* Record IRQ to NAPI struct */
-       netif_napi_set_irq(&nv->napi,
-                          pci_irq_vector(to_pci_dev(fbd->dev), nv->v_idx));
+       netif_napi_set_irq_locked(&nv->napi,
+                                 pci_irq_vector(to_pci_dev(fbd->dev),
+                                                nv->v_idx));
 
        /* Tie nv back to PCIe dev */
        nv->dev = fbd->dev;
@@ -1704,7 +1705,7 @@ static int fbnic_alloc_napi_vector(struct fbnic_dev *fbd, struct fbnic_net *fbn,
        return 0;
 
 napi_del:
-       netif_napi_del(&nv->napi);
+       netif_napi_del_locked(&nv->napi);
        fbn->napi[fbnic_napi_idx(nv)] = NULL;
        kfree(nv);
        return err;
@@ -2173,7 +2174,7 @@ void fbnic_napi_disable(struct fbnic_net *fbn)
        int i;
 
        for (i = 0; i < fbn->num_napi; i++) {
-               napi_disable(&fbn->napi[i]->napi);
+               napi_disable_locked(&fbn->napi[i]->napi);
 
                fbnic_nv_irq_disable(fbn->napi[i]);
        }
@@ -2621,7 +2622,7 @@ void fbnic_napi_enable(struct fbnic_net *fbn)
        for (i = 0; i < fbn->num_napi; i++) {
                struct fbnic_napi_vector *nv = fbn->napi[i];
 
-               napi_enable(&nv->napi);
+               napi_enable_locked(&nv->napi);
 
                fbnic_nv_irq_enable(nv);