]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ethtool: make sure __ethtool_get_link_ksettings() is ops-locked
authorJakub Kicinski <kuba@kernel.org>
Wed, 3 Jun 2026 01:28:40 +0000 (18:28 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 4 Jun 2026 21:04:56 +0000 (14:04 -0700)
All drivers which may call *_get_link_ksettings() on ops-locked
devices from paths already holding the ops lock are ready now.
Make __ethtool_get_link_ksettings() take the ops lock, and assert
that it's held in netif_get_link_ksettings().

Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20260603012840.2254293-12-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ethtool/ioctl.c

index 49da873b673ded64ae7d9e6ec840a1b250d2e68c..a4b0cbae406366d505f138bcdf24f6d1a6315706 100644 (file)
@@ -439,7 +439,7 @@ struct ethtool_link_usettings {
 int netif_get_link_ksettings(struct net_device *dev,
                             struct ethtool_link_ksettings *link_ksettings)
 {
-       /* once callers fixed - assert ops locked */
+       netdev_assert_locked_ops_compat(dev);
 
        if (!dev->ethtool_ops->get_link_ksettings)
                return -EOPNOTSUPP;
@@ -456,10 +456,14 @@ EXPORT_SYMBOL(netif_get_link_ksettings);
 int __ethtool_get_link_ksettings(struct net_device *dev,
                                 struct ethtool_link_ksettings *link_ksettings)
 {
+       int ret;
+
        ASSERT_RTNL();
 
-       /* once callers fixed - take the ops lock around this call */
-       return netif_get_link_ksettings(dev, link_ksettings);
+       netdev_lock_ops(dev);
+       ret = netif_get_link_ksettings(dev, link_ksettings);
+       netdev_unlock_ops(dev);
+       return ret;
 }
 EXPORT_SYMBOL(__ethtool_get_link_ksettings);