net: add net device refcount tracker to ethtool_phys_id()
authorEric Dumazet <edumazet@google.com>
Sun, 5 Dec 2021 04:22:00 +0000 (20:22 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Dec 2021 00:05:10 +0000 (16:05 -0800)
This helper might hold a netdev reference for a long time,
lets add reference tracking.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ethtool/ioctl.c

index fa8aa5ec19ba1cfff611a159c5b8bcd02f74c5ca..9a113d89352123acf56ec598c191bb75985c6be5 100644 (file)
@@ -1989,6 +1989,7 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
        struct ethtool_value id;
        static bool busy;
        const struct ethtool_ops *ops = dev->ethtool_ops;
+       netdevice_tracker dev_tracker;
        int rc;
 
        if (!ops->set_phys_id)
@@ -2008,7 +2009,7 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
         * removal of the device.
         */
        busy = true;
-       dev_hold(dev);
+       dev_hold_track(dev, &dev_tracker, GFP_KERNEL);
        rtnl_unlock();
 
        if (rc == 0) {
@@ -2032,7 +2033,7 @@ static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
        }
 
        rtnl_lock();
-       dev_put(dev);
+       dev_put_track(dev, &dev_tracker);
        busy = false;
 
        (void) ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);