]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
batman-adv: replace non-atomic vlan config fields with (READ|WRITE)_ONCE
authorSven Eckelmann <sven@narfation.org>
Tue, 12 May 2026 17:37:05 +0000 (19:37 +0200)
committerSven Eckelmann <sven@narfation.org>
Mon, 1 Jun 2026 12:22:01 +0000 (14:22 +0200)
The vlan configuration values are only accessed as plain loads/stores and
do not require full atomic_t semantics. Convert these fields to native
integer types and replace their users with READ_ONCE()/WRITE_ONCE() to
avoid load/store tearing.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
net/batman-adv/main.c
net/batman-adv/mesh-interface.c
net/batman-adv/netlink.c
net/batman-adv/translation-table.c
net/batman-adv/types.h

index d529014857c904960f1f1f81a066bbedde6f521a..a5398c5df2632da677370b2336f7a81631638cbb 100644 (file)
@@ -627,7 +627,7 @@ bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid)
         */
        vlan = batadv_meshif_vlan_get(bat_priv, vid);
        if (vlan) {
-               ap_isolation_enabled = atomic_read(&vlan->ap_isolation);
+               ap_isolation_enabled = READ_ONCE(vlan->ap_isolation);
                batadv_meshif_vlan_put(vlan);
        }
 
index 071cbf1c1d317b484e08fada5c4563418d946125..58cbb4f8a5abdf05aca8e2599bbd46e88fceb65b 100644 (file)
@@ -567,7 +567,7 @@ int batadv_meshif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
        vlan->vid = vid;
        kref_init(&vlan->refcount);
 
-       atomic_set(&vlan->ap_isolation, 0);
+       WRITE_ONCE(vlan->ap_isolation, 0);
 
        kref_get(&vlan->refcount);
        hlist_add_head_rcu(&vlan->list, &bat_priv->meshif_vlan_list);
index 368072f0513c2f6d2e95b07b16cbf0b6eab4cfc8..e5463003a3bd69bd1fdf14cdc7804e030a06d9fd 100644 (file)
@@ -181,7 +181,7 @@ static int batadv_netlink_mesh_fill_ap_isolation(struct sk_buff *msg,
        if (!vlan)
                return 0;
 
-       ap_isolation = atomic_read(&vlan->ap_isolation);
+       ap_isolation = READ_ONCE(vlan->ap_isolation);
        batadv_meshif_vlan_put(vlan);
 
        return nla_put_u8(msg, BATADV_ATTR_AP_ISOLATION_ENABLED,
@@ -204,7 +204,7 @@ static int batadv_netlink_set_mesh_ap_isolation(struct nlattr *attr,
        if (!vlan)
                return -ENOENT;
 
-       atomic_set(&vlan->ap_isolation, !!nla_get_u8(attr));
+       WRITE_ONCE(vlan->ap_isolation, !!nla_get_u8(attr));
        batadv_meshif_vlan_put(vlan);
 
        return 0;
@@ -1022,7 +1022,7 @@ static int batadv_netlink_vlan_fill(struct sk_buff *msg,
                goto nla_put_failure;
 
        if (nla_put_u8(msg, BATADV_ATTR_AP_ISOLATION_ENABLED,
-                      !!atomic_read(&vlan->ap_isolation)))
+                      !!READ_ONCE(vlan->ap_isolation)))
                goto nla_put_failure;
 
        genlmsg_end(msg, hdr);
@@ -1110,7 +1110,7 @@ static int batadv_netlink_set_vlan(struct sk_buff *skb, struct genl_info *info)
        if (info->attrs[BATADV_ATTR_AP_ISOLATION_ENABLED]) {
                attr = info->attrs[BATADV_ATTR_AP_ISOLATION_ENABLED];
 
-               atomic_set(&vlan->ap_isolation, !!nla_get_u8(attr));
+               WRITE_ONCE(vlan->ap_isolation, !!nla_get_u8(attr));
        }
 
        batadv_netlink_notify_vlan(bat_priv, vlan);
index 28869f65ada09af2bc5de5e42ec3b5324a31b61f..515f26ff8c269a7019e9f506f4d2e502c597a7df 100644 (file)
@@ -3730,7 +3730,7 @@ bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
        if (!vlan)
                return false;
 
-       if (!atomic_read(&vlan->ap_isolation))
+       if (!READ_ONCE(vlan->ap_isolation))
                goto vlan_put;
 
        tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid);
index dd63cd28914d786f253d5d751795de2a06d43796..cf01a670d8250a5306cbe81f19b091898252814c 100644 (file)
@@ -1459,7 +1459,7 @@ struct batadv_meshif_vlan {
        unsigned short vid;
 
        /** @ap_isolation: AP isolation state */
-       atomic_t ap_isolation;          /* boolean */
+       u8 ap_isolation;                /* boolean */
 
        /** @tt: TT private attributes (VLAN specific) */
        struct batadv_vlan_tt tt;