diff options
author | Vlad Buslov <vladbu@mellanox.com> | 2019-02-11 10:55:40 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-12 13:41:33 -0500 |
commit | fe2923afc12490e92237d23fc0b29f31da72a4f9 (patch) | |
tree | 5bcb097d9029d658b8a500bdb534eea13924edc9 /net/sched/sch_api.c | |
parent | 4dbfa766440c6dfe3d10f077cde966a7d11b58f1 (diff) | |
download | linux-stable-fe2923afc12490e92237d23fc0b29f31da72a4f9.tar.gz linux-stable-fe2923afc12490e92237d23fc0b29f31da72a4f9.tar.bz2 linux-stable-fe2923afc12490e92237d23fc0b29f31da72a4f9.zip |
net: sched: traverse classifiers in chain with tcf_get_next_proto()
All users of chain->filters_chain rely on rtnl lock and assume that no new
classifier instances are added when traversing the list. Use
tcf_get_next_proto() to traverse filters list without relying on rtnl
mutex. This function iterates over classifiers by taking reference to
current iterator classifier only and doesn't assume external
synchronization of filters list.
Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r-- | net/sched/sch_api.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 80058abc729f..9a530cad2759 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -1914,8 +1914,8 @@ static void tc_bind_tclass(struct Qdisc *q, u32 portid, u32 clid, chain = tcf_get_next_chain(block, chain)) { struct tcf_proto *tp; - for (tp = rtnl_dereference(chain->filter_chain); - tp; tp = rtnl_dereference(tp->next)) { + for (tp = tcf_get_next_proto(chain, NULL); + tp; tp = tcf_get_next_proto(chain, tp)) { struct tcf_bind_args arg = {}; arg.w.fn = tcf_node_bind; |