On Mon, Feb 18, 2019 at 3:06 AM Vlad Buslov <vla...@mellanox.com> wrote: > > On Fri 15 Feb 2019 at 22:35, Cong Wang <xiyou.wangc...@gmail.com> wrote: > > On Mon, Feb 11, 2019 at 12:56 AM Vlad Buslov <vla...@mellanox.com> wrote: > >> +#ifdef CONFIG_PROVE_LOCKING > >> +static inline bool lockdep_tcf_chain_is_locked(struct tcf_chain *chain) > >> +{ > >> + return lockdep_is_held(&chain->filter_chain_lock); > >> +} > >> +#else > >> +static inline bool lockdep_tcf_chain_is_locked(struct tcf_block *chain) > >> +{ > >> + return true; > >> +} > >> +#endif /* #ifdef CONFIG_PROVE_LOCKING */ > >> + > >> +#define tcf_chain_dereference(p, chain) > >> \ > >> + rcu_dereference_protected(p, lockdep_tcf_chain_is_locked(chain)) > > > > > > Are you sure you need this #ifdef CONFIG_PROVE_LOCKING? > > rcu_dereference_protected() should already test CONFIG_PROVE_RCU. > > > > Ditto for tcf_proto_dereference(). > > I implemented these macro same way as rtnl_dereference() is implemented, > which they are intended to substitute. > > After removing them I get following compilation error with > CONFIG_PROVE_LOCKING disabled:
This is pretty odd, because net/core/neighbour.c uses it without any #ifdef CONFIG_PROVE_LOCKING, for instance: 192 neigh = rcu_dereference_protected(n->next, 193 lockdep_is_held(&tbl->lock)); 194 rcu_assign_pointer(*np, neigh); 195 neigh_mark_dead(n); 196 retval = true; So how does this compile when CONFIG_PROVE_LOCKING is disabled? :-/