]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
r8169: use RTNL to protect critical sections
authorHeiner Kallweit <hkallweit1@gmail.com>
Sat, 20 Jun 2020 20:38:24 +0000 (22:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Jun 2020 23:26:02 +0000 (16:26 -0700)
Most relevant ops (open, close, ethtool ops) are protected with RTNL
lock by net core. Make sure that such ops can't be interrupted by
e.g. (runtime-)suspending by taking the RTNL lock in suspend ops
and the PCI error handler.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/realtek/r8169_main.c

index 4d3e7db94bdd9e13a2f5ed879c341f5b46779763..5a6d53fe8f86c1bbcd87ee1a65709ac9debdf591 100644 (file)
@@ -4524,6 +4524,7 @@ static void rtl_task(struct work_struct *work)
        struct rtl8169_private *tp =
                container_of(work, struct rtl8169_private, wk.work);
 
+       rtnl_lock();
        rtl_lock_work(tp);
 
        if (!netif_running(tp->dev) ||
@@ -4536,6 +4537,7 @@ static void rtl_task(struct work_struct *work)
        }
 out_unlock:
        rtl_unlock_work(tp);
+       rtnl_unlock();
 }
 
 static int rtl8169_poll(struct napi_struct *napi, int budget)
@@ -4788,7 +4790,9 @@ static int __maybe_unused rtl8169_suspend(struct device *device)
 {
        struct rtl8169_private *tp = dev_get_drvdata(device);
 
+       rtnl_lock();
        rtl8169_net_suspend(tp);
+       rtnl_unlock();
 
        return 0;
 }
@@ -4816,11 +4820,13 @@ static int rtl8169_runtime_suspend(struct device *device)
                return 0;
        }
 
+       rtnl_lock();
        rtl_lock_work(tp);
        __rtl8169_set_wol(tp, WAKE_PHY);
        rtl_unlock_work(tp);
 
        rtl8169_net_suspend(tp);
+       rtnl_unlock();
 
        return 0;
 }
@@ -4882,7 +4888,9 @@ static void rtl_shutdown(struct pci_dev *pdev)
 {
        struct rtl8169_private *tp = pci_get_drvdata(pdev);
 
+       rtnl_lock();
        rtl8169_net_suspend(tp);
+       rtnl_unlock();
 
        /* Restore original MAC address */
        rtl_rar_set(tp, tp->dev->perm_addr);