]> git.baikalelectronics.ru Git - kernel.git/commit
net_sched: fix reference counting of tc filter chain
authorCong Wang <xiyou.wangcong@gmail.com>
Mon, 11 Sep 2017 23:33:31 +0000 (16:33 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Sep 2017 03:41:02 +0000 (20:41 -0700)
commit17c6eb5bd38bb86394fd647cb1f83bbb8382e2e1
tree7a56e93516b7ddd563fcfaadf508c3f0cc4783cb
parent3c38b47dcdd5dfd0f3dc5b3d6fa01500b964cce6
net_sched: fix reference counting of tc filter chain

This patch fixes the following ugliness of tc filter chain refcnt:

a) tp proto should hold a refcnt to the chain too. This significantly
   simplifies the logic.

b) Chain 0 is no longer special, it is created with refcnt=1 like any
   other chains. All the ugliness in tcf_chain_put() can be gone!

c) No need to handle the flushing oddly, because block still holds
   chain 0, it can not be released, this guarantees block is the last
   user.

d) The race condition with RCU callbacks is easier to handle with just
   a rcu_barrier(). Much easier to understand, nothing to hide. Thanks
   to the previous patch. Please see also the comments in code.

e) Make the code understandable by humans, much less error-prone.

Fixes: 4790f4c3f63d ("net: sched: fix use after free when tcf_chain_destroy is called multiple times")
Fixes: 271fce5a6e27 ("net: sched: introduce multichain support for filters")
Cc: Jiri Pirko <jiri@mellanox.com>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/cls_api.c