On Mon, Aug 13, 2018 at 12:16 PM Cong Wang <xiyou.wangc...@gmail.com> wrote: > > On Mon, Aug 13, 2018 at 10:20 AM Vlad Buslov <vla...@mellanox.com> wrote: > > > > Lockdep reports deadlock for following locking scenario in ife action: > > > > Task one: > > 1) Executes ife action update. > > 2) Takes tcfa_lock. > > 3) Waits on ife_mod_lock which is already taken by task two. > > > > Task two: > > > > 1) Executes any path that obtains ife_mod_lock without disabling bh (any > > path that takes ife_mod_lock while holding tcfa_lock has bh disabled) like > > loading a meta module, or creating new action. > > 2) Takes ife_mod_lock. > > 3) Task is preempted by rate estimator timer. > > 4) Timer callback waits on tcfa_lock which is taken by task one. > > > > In described case tasks deadlock because they take same two locks in > > different order. To prevent potential deadlock reported by lockdep, always > > disable bh when obtaining ife_mod_lock. > > Your fix doesn't make sense, because what ife_mod_lock protects > is absolutely not touched in BH context, they have no race. > > The only time you need tcfa_lock is when adding it to ->metalist: > > list_add_tail(&mi->metalist, &ife->metalist); > > when it already exists. > > Which means you can just take tcfa_lock after taking ife_mod_lock.
BTW, there is an obvious deadlock: use_all_metadata() acquires read_lock(&ife_mod_lock), then calls add_metainfo() which calls find_ife_oplist() which acquires the same lock.... But this is _irreverent_ to your fix, just want to point it out.