Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

eth: via-rhine: fix calling napi_enable() in atomic context

napi_enable() may sleep now, take netdev_lock() before rp->lock.
napi_enable() is hidden inside init_registers().

Note that this patch orders netdev_lock after rp->task_lock,
to avoid having to take the netdev_lock() around disable path.

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
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250124031841.1179756-7-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+10 -1
+10 -1
drivers/net/ethernet/via/via-rhine.c
··· 1568 1568 if (rp->quirks & rqMgmt) 1569 1569 rhine_init_cam_filter(dev); 1570 1570 1571 - napi_enable(&rp->napi); 1571 + napi_enable_locked(&rp->napi); 1572 1572 1573 1573 iowrite16(RHINE_EVENT & 0xffff, ioaddr + IntrEnable); 1574 1574 ··· 1696 1696 rhine_power_init(dev); 1697 1697 rhine_chip_reset(dev); 1698 1698 rhine_task_enable(rp); 1699 + 1700 + netdev_lock(dev); 1699 1701 init_registers(dev); 1702 + netdev_unlock(dev); 1700 1703 1701 1704 netif_dbg(rp, ifup, dev, "%s() Done - status %04x MII status: %04x\n", 1702 1705 __func__, ioread16(ioaddr + ChipCmd), ··· 1730 1727 1731 1728 napi_disable(&rp->napi); 1732 1729 netif_tx_disable(dev); 1730 + 1731 + netdev_lock(dev); 1733 1732 spin_lock_bh(&rp->lock); 1734 1733 1735 1734 /* clear all descriptors */ ··· 1745 1740 init_registers(dev); 1746 1741 1747 1742 spin_unlock_bh(&rp->lock); 1743 + netdev_unlock(dev); 1748 1744 1749 1745 netif_trans_update(dev); /* prevent tx timeout */ 1750 1746 dev->stats.tx_errors++; ··· 2547 2541 alloc_tbufs(dev); 2548 2542 rhine_reset_rbufs(rp); 2549 2543 rhine_task_enable(rp); 2544 + 2545 + netdev_lock(dev); 2550 2546 spin_lock_bh(&rp->lock); 2551 2547 init_registers(dev); 2552 2548 spin_unlock_bh(&rp->lock); 2549 + netdev_unlock(dev); 2553 2550 2554 2551 netif_device_attach(dev); 2555 2552