mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 00:29:35 +08:00
net/sched: Revert "net/sched: Restrict conditions for adding duplicating netems to qdisc tree"
This reverts commitec8e0e3d7a. 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:ec8e0e3d7a("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>
This commit is contained in:
committed by
Paolo Abeni
parent
98b34f3e8c
commit
eda0b7f203
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user