]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
eth: forcedeth: fix calling napi_enable() in atomic context
authorJakub Kicinski <kuba@kernel.org>
Fri, 24 Jan 2025 03:18:37 +0000 (19:18 -0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 27 Jan 2025 22:30:49 +0000 (14:30 -0800)
napi_enable() may sleep now, take netdev_lock() before np->lock.

Fixes: 413f0271f396 ("net: protect NAPI enablement with netdev_lock()")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://lore.kernel.org/dcfd56bc-de32-4b11-9e19-d8bd1543745d@stanley.mountain
Acked-by: Zhu Yanjun <zyjzyj2000@gmail.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250124031841.1179756-4-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/nvidia/forcedeth.c

index b00df57f2ca3965966e7afc6c775c54a61819f6d..499e5e39d5134c3f404bb406b64f1ccc88ae4bbf 100644 (file)
@@ -5562,6 +5562,7 @@ static int nv_open(struct net_device *dev)
        /* ask for interrupts */
        nv_enable_hw_interrupts(dev, np->irqmask);
 
+       netdev_lock(dev);
        spin_lock_irq(&np->lock);
        writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
        writel(0, base + NvRegMulticastAddrB);
@@ -5580,7 +5581,7 @@ static int nv_open(struct net_device *dev)
        ret = nv_update_linkspeed(dev);
        nv_start_rxtx(dev);
        netif_start_queue(dev);
-       napi_enable(&np->napi);
+       napi_enable_locked(&np->napi);
 
        if (ret) {
                netif_carrier_on(dev);
@@ -5597,6 +5598,7 @@ static int nv_open(struct net_device *dev)
                        round_jiffies(jiffies + STATS_INTERVAL));
 
        spin_unlock_irq(&np->lock);
+       netdev_unlock(dev);
 
        /* If the loopback feature was set while the device was down, make sure
         * that it's set correctly now.