Annotate data races around vlan group's num_vlans, it can be read lockless. Signed-off-by: Nikolay Aleksandrov --- net/bridge/br_netlink.c | 4 ++-- net/bridge/br_vlan.c | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 62ce96d9ba32..ae76df0de05a 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -81,7 +81,7 @@ static int br_get_num_vlan_infos(struct net_bridge_vlan_group *vg, return 0; if (filter_mask & RTEXT_FILTER_BRVLAN) - return vg->num_vlans; + return READ_ONCE(vg->num_vlans); rcu_read_lock(); num_vlans = __get_num_vlan_infos(vg, filter_mask); @@ -531,7 +531,7 @@ static int br_fill_ifinfo(struct sk_buff *skb, else vg = br_vlan_group_rcu(br); - if (!vg || !vg->num_vlans) { + if (!vg || !READ_ONCE(vg->num_vlans)) { rcu_read_unlock(); goto done; } diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 102792f20a5e..95187a607ec2 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c @@ -344,7 +344,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags, goto out_filt; } } - vg->num_vlans++; + WRITE_ONCE(vg->num_vlans, vg->num_vlans + 1); } /* set the state before publishing */ @@ -367,7 +367,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags, out_fdb_insert: if (br_vlan_should_use(v)) { br_fdb_find_delete_local(br, p, dev->dev_addr, v->vid); - vg->num_vlans--; + WRITE_ONCE(vg->num_vlans, vg->num_vlans - 1); } out_filt: @@ -417,7 +417,7 @@ static int __vlan_del(struct net_bridge_vlan *v) if (br_vlan_should_use(v)) { WRITE_ONCE(v->flags, v->flags & ~BRIDGE_VLAN_INFO_BRENTRY); - vg->num_vlans--; + WRITE_ONCE(vg->num_vlans, vg->num_vlans - 1); } if (masterv != v) { @@ -695,7 +695,7 @@ bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid) return true; vg = nbp_vlan_group_rcu(p); - if (!vg || !vg->num_vlans) + if (!vg || !READ_ONCE(vg->num_vlans)) return false; if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto) @@ -757,7 +757,7 @@ static int br_vlan_add_existing(struct net_bridge *br, refcount_inc(&vlan->refcnt); WRITE_ONCE(vlan->flags, vlan->flags | BRIDGE_VLAN_INFO_BRENTRY); - vg->num_vlans++; + WRITE_ONCE(vg->num_vlans, vg->num_vlans + 1); *changed = true; br_multicast_toggle_one_vlan(vlan, true); } -- 2.47.3