Annotate data races around vlan msti field, it can be read lockless.

Signed-off-by: Nikolay Aleksandrov <[email protected]>
---
 net/bridge/br_mst.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/bridge/br_mst.c b/net/bridge/br_mst.c
index 95e49ec8065e..76a5bf287578 100644
--- a/net/bridge/br_mst.c
+++ b/net/bridge/br_mst.c
@@ -123,7 +123,7 @@ int br_mst_set_state(struct net_bridge_port *p, u16 msti, 
u8 state,
 
        err = 0;
        list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
-               if (v->brvlan->msti != msti)
+               if (READ_ONCE(v->brvlan->msti) != msti)
                        continue;
 
                br_mst_vlan_set_state(vg, v, state);
@@ -176,7 +176,7 @@ int br_mst_vlan_set_msti(struct net_bridge_vlan *mv, u16 
msti)
        if (err && err != -EOPNOTSUPP)
                return err;
 
-       mv->msti = msti;
+       WRITE_ONCE(mv->msti, msti);
 
        list_for_each_entry(p, &mv->br->port_list, list) {
                vg = nbp_vlan_group(p);
@@ -249,7 +249,9 @@ size_t br_mst_info_size(const struct net_bridge_vlan_group 
*vg)
        sz = nla_total_size(0);
 
        list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
-               if (test_bit(v->brvlan->msti, seen))
+               u16 msti = READ_ONCE(v->brvlan->msti);
+
+               if (test_bit(msti, seen))
                        continue;
 
                /* IFLA_BRIDGE_MST_ENTRY */
@@ -259,7 +261,7 @@ size_t br_mst_info_size(const struct net_bridge_vlan_group 
*vg)
                        /* IFLA_BRIDGE_MST_ENTRY_STATE */
                        nla_total_size(sizeof(u8));
 
-               __set_bit(v->brvlan->msti, seen);
+               __set_bit(msti, seen);
        }
 
        return sz;
-- 
2.47.3


Reply via email to