On Wed, 2017-10-11 at 06:10 -0700, Eric Dumazet wrote: > On Tue, 2017-10-10 at 22:33 -0400, Manish Kurup wrote: > > Using a spinlock in the VLAN action causes performance issues when the VLAN > > action is used on multiple cores. Rewrote the VLAN action to use RCU read > > locking for reads and updates instead. > > > > Signed-off-by: Manish Kurup <manish.ku...@verizon.com> > > --- > > include/net/tc_act/tc_vlan.h | 21 ++++++++----- > > net/sched/act_vlan.c | 73 > > ++++++++++++++++++++++++++++++-------------- > > 2 files changed, 63 insertions(+), 31 deletions(-) > > > > diff --git a/include/net/tc_act/tc_vlan.h b/include/net/tc_act/tc_vlan.h > > index c2090df..67fd355 100644 > > --- a/include/net/tc_act/tc_vlan.h > > +++ b/include/net/tc_act/tc_vlan.h > > @@ -13,12 +13,17 @@ > > #include <net/act_api.h> > > #include <linux/tc_act/tc_vlan.h> > > > > +struct tcf_vlan_params { > > + struct rcu_head rcu; > > + int tcfv_action; > > + u16 tcfv_push_vid; > > + __be16 tcfv_push_proto; > > + u8 tcfv_push_prio; > > +}; > > + > > struct tcf_vlan { > > struct tc_action common; > > - int tcfv_action; > > - u16 tcfv_push_vid; > > - __be16 tcfv_push_proto; > > - u8 tcfv_push_prio; > > + struct tcf_vlan_params __rcu *vlan_p; > > }; > > #define to_vlan(a) ((struct tcf_vlan *)a) > > > > @@ -33,22 +38,22 @@ static inline bool is_tcf_vlan(const struct tc_action > > *a) > > > > static inline u32 tcf_vlan_action(const struct tc_action *a) > > { > > - return to_vlan(a)->tcfv_action; > > + return to_vlan(a)->vlan_p->tcfv_action; > > This is not proper RCU : ->vlan_p should be read once, and using > rcu_dereference() > > So the caller should provide to this helper the 'p' pointer instead of > 'a' > > > CONFIG_SPARSE_RCU_POINTER=y > > and make C=2 would probably give you warnings about that. >
BTW no need to change your .config after : commit 41a2901e7d220875752a8c870e0b53288a578c20 Author: Paul E. McKenney <paul...@linux.vnet.ibm.com> Date: Fri May 12 15:56:35 2017 -0700 rcu: Remove SPARSE_RCU_POINTER Kconfig option The sparse-based checking for non-RCU accesses to RCU-protected pointers has been around for a very long time, and it is now the only type of sparse-based checking that is optional. This commit therefore makes it unconditional. Reported-by: Ingo Molnar <mi...@kernel.org> Signed-off-by: Paul E. McKenney <paul...@linux.vnet.ibm.com> Cc: Fengguang Wu <fengguang...@intel.com>