]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/sched: Revert "net/sched: Restrict conditions for adding duplicating netems to...
authorJamal Hadi Salim <jhs@mojatatu.com>
Mon, 25 May 2026 12:25:49 +0000 (08:25 -0400)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 28 May 2026 10:26:36 +0000 (12:26 +0200)
This reverts commit ec8e0e3d7adef940cdf9475e2352c0680189d14e.

The original patch rejects any tree containing two netems when
either has duplication set, even when they sit on unrelated classes
of the same classful parent. That broke configurations that have
worked since netem was introduced.

The re-entrancy problem the original commit was trying to solve is
handled by later patch using tc_depth flag.

Doing this revert will (re)expose the original bug with multiple
netem duplication. When this patch is backported make sure
and get the full series.

Fixes: ec8e0e3d7ade ("net/sched: Restrict conditions for adding duplicating netems to qdisc tree")
Reported-by: Ji-Soo Chung <jschung2@proton.me>
Reported-by: Gerlinde <lrGerlinde@mailfence.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220774
Reported-by: zyc zyc <zyc199902@zohomail.cn>
Closes: https://lore.kernel.org/all/19adda5a1e2.12410b78222774.9191120410578703463@zohomail.cn/
Reported-by: Manas Ghandat <ghandatmanas@gmail.com>
Closes: https://lore.kernel.org/netdev/f69b2c8f-8325-4c2e-a011-6dbc089f30e4@gmail.com/
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
Link: https://patch.msgid.link/20260525122556.973584-3-jhs@mojatatu.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/sched/sch_netem.c

index bc18e1976b6e07f81f975ceeb35c8b1a5125e8df..d97acd2f39234644d2758f7ecbabdf221ee20395 100644 (file)
@@ -1007,41 +1007,6 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,
        return 0;
 }
 
-static const struct Qdisc_class_ops netem_class_ops;
-
-static int check_netem_in_tree(struct Qdisc *sch, bool duplicates,
-                              struct netlink_ext_ack *extack)
-{
-       struct Qdisc *root, *q;
-       unsigned int i;
-
-       root = qdisc_root_sleeping(sch);
-
-       if (sch != root && root->ops->cl_ops == &netem_class_ops) {
-               if (duplicates ||
-                   ((struct netem_sched_data *)qdisc_priv(root))->duplicate)
-                       goto err;
-       }
-
-       if (!qdisc_dev(root))
-               return 0;
-
-       hash_for_each(qdisc_dev(root)->qdisc_hash, i, q, hash) {
-               if (sch != q && q->ops->cl_ops == &netem_class_ops) {
-                       if (duplicates ||
-                           ((struct netem_sched_data *)qdisc_priv(q))->duplicate)
-                               goto err;
-               }
-       }
-
-       return 0;
-
-err:
-       NL_SET_ERR_MSG(extack,
-                      "netem: cannot mix duplicating netems with other netems in tree");
-       return -EINVAL;
-}
-
 /* Parse netlink message to set options */
 static int netem_change(struct Qdisc *sch, struct nlattr *opt,
                        struct netlink_ext_ack *extack)
@@ -1118,11 +1083,6 @@ static int netem_change(struct Qdisc *sch, struct nlattr *opt,
        q->gap = qopt->gap;
        q->counter = 0;
        q->loss = qopt->loss;
-
-       ret = check_netem_in_tree(sch, qopt->duplicate, extack);
-       if (ret)
-               goto unlock;
-
        q->duplicate = qopt->duplicate;
 
        /* for compatibility with earlier versions.