]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: sched: don't recurse on the netdev ops lock in qdiscs
authorJakub Kicinski <kuba@kernel.org>
Wed, 3 Jun 2026 01:28:37 +0000 (18:28 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 4 Jun 2026 21:04:56 +0000 (14:04 -0700)
cbs_set_port_rate() and taprio_set_picos_per_byte() are reached from
two paths and both already hold the device's ops lock:

 *_change(), via tc_modify_qdisc() which calls netdev_lock_ops(dev)
    before dispatching to the qdisc ops.

 *_dev_notifier() on NETDEV_UP / NETDEV_CHANGE, where caller
    holds the ops lock across the notifier chain.

Switch to netif_get_link_ksettings() to avoid deadlock once
__ethtool_get_link_ksettings() starts taking the netdev lock.

Link: https://patch.msgid.link/20260603012840.2254293-9-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_cbs.c
net/sched/sch_taprio.c

index b952353ec2a53ae04c15fdc60f1b7d50bdbb957a..85b41ffc63ff1435912d1ff9088df8da1dc26ad0 100644 (file)
@@ -327,7 +327,7 @@ static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q)
        s64 port_rate;
        int err;
 
-       err = __ethtool_get_link_ksettings(dev, &ecmd);
+       err = netif_get_link_ksettings(dev, &ecmd);
        if (err < 0)
                goto skip;
 
index d6b981e5df11cba060c9c92212479c0d5a058f5b..e83cbce62a54a71ccc55b752acb6ce6db442cbd7 100644 (file)
@@ -1299,7 +1299,7 @@ static void taprio_set_picos_per_byte(struct net_device *dev,
        int picos_per_byte;
        int err;
 
-       err = __ethtool_get_link_ksettings(dev, &ecmd);
+       err = netif_get_link_ksettings(dev, &ecmd);
        if (err < 0)
                goto skip;