Annotate data races around vlan group's num_vlans, it can be read lockless.

Signed-off-by: Nikolay Aleksandrov <[email protected]>
---
 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


Reply via email to