Message ID | 20190328093506.9625-1-nicolas.dichtel@6wind.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] net/sched: fix ->get helper of the matchall cls | expand |
From: Nicolas Dichtel <nicolas.dichtel@6wind.com> Date: Thu, 28 Mar 2019 10:35:06 +0100 > It returned always NULL, thus it was never possible to get the filter. > > Example: > $ ip link add foo type dummy > $ ip link add bar type dummy > $ tc qdisc add dev foo clsact > $ tc filter add dev foo protocol all pref 1 ingress handle 1234 \ > matchall action mirred ingress mirror dev bar > > Before the patch: > $ tc filter get dev foo protocol all pref 1 ingress handle 1234 matchall > Error: Specified filter handle not found. > We have an error talking to the kernel > > After: > $ tc filter get dev foo protocol all pref 1 ingress handle 1234 matchall > filter ingress protocol all pref 1 matchall chain 0 handle 0x4d2 > not_in_hw > action order 1: mirred (Ingress Mirror to device bar) pipe > index 1 ref 1 bind 1 > > CC: Yotam Gigi <yotamg@mellanox.com> > CC: Jiri Pirko <jiri@mellanox.com> > Fixes: fd62d9f5c575 ("net/sched: matchall: Fix configuration race") > Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> I'll apply this and queue it up for -stable, but we really should add a testcase to selftests for this if we don't have one already.
diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c index 459921bd3d87..a13bc351a414 100644 --- a/net/sched/cls_matchall.c +++ b/net/sched/cls_matchall.c @@ -130,6 +130,11 @@ static void mall_destroy(struct tcf_proto *tp, bool rtnl_held, static void *mall_get(struct tcf_proto *tp, u32 handle) { + struct cls_mall_head *head = rtnl_dereference(tp->root); + + if (head && head->handle == handle) + return head; + return NULL; }
It returned always NULL, thus it was never possible to get the filter. Example: $ ip link add foo type dummy $ ip link add bar type dummy $ tc qdisc add dev foo clsact $ tc filter add dev foo protocol all pref 1 ingress handle 1234 \ matchall action mirred ingress mirror dev bar Before the patch: $ tc filter get dev foo protocol all pref 1 ingress handle 1234 matchall Error: Specified filter handle not found. We have an error talking to the kernel After: $ tc filter get dev foo protocol all pref 1 ingress handle 1234 matchall filter ingress protocol all pref 1 matchall chain 0 handle 0x4d2 not_in_hw action order 1: mirred (Ingress Mirror to device bar) pipe index 1 ref 1 bind 1 CC: Yotam Gigi <yotamg@mellanox.com> CC: Jiri Pirko <jiri@mellanox.com> Fixes: fd62d9f5c575 ("net/sched: matchall: Fix configuration race") Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> --- net/sched/cls_matchall.c | 5 +++++ 1 file changed, 5 insertions(+)