aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kobject.c
diff options
context:
space:
mode:
authorCong Wang <xiyou.wangcong@gmail.com>2018-10-02 12:50:19 -0700
committerDavid S. Miller <davem@davemloft.net>2018-10-05 00:36:31 -0700
commit95278ddaa15cfa23e4a06ee9ed7b6ee0197c500b (patch)
tree66c03ef2f1ffb146684af06d2cf664a262037715 /lib/kobject.c
parentnet/neigh: Extend dump filter to proxy neighbor dumps (diff)
downloadlinux-dev-95278ddaa15cfa23e4a06ee9ed7b6ee0197c500b.tar.xz
linux-dev-95278ddaa15cfa23e4a06ee9ed7b6ee0197c500b.zip
net_sched: convert idrinfo->lock from spinlock to a mutex
In commit ec3ed293e766 ("net_sched: change tcf_del_walker() to take idrinfo->lock") we move fl_hw_destroy_tmplt() to a workqueue to avoid blocking with the spinlock held. Unfortunately, this causes a lot of troubles here: 1. tcf_chain_destroy() could be called right after we queue the work but before the work runs. This is a use-after-free. 2. The chain refcnt is already 0, we can't even just hold it again. We can check refcnt==1 but it is ugly. 3. The chain with refcnt 0 is still visible in its block, which means it could be still found and used! 4. The block has a refcnt too, we can't hold it without introducing a proper API either. We can make it working but the end result is ugly. Instead of wasting time on reviewing it, let's just convert the troubling spinlock to a mutex, which allows us to use non-atomic allocations too. Fixes: ec3ed293e766 ("net_sched: change tcf_del_walker() to take idrinfo->lock") Reported-by: Ido Schimmel <idosch@idosch.org> Cc: Jamal Hadi Salim <jhs@mojatatu.com> Cc: Vlad Buslov <vladbu@mellanox.com> Cc: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Tested-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib/kobject.c')
0 files changed, 0 insertions, 0 deletions