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 <[email protected]>
---
 net/batman-adv/main.c              | 2 +-
 net/batman-adv/mesh-interface.c    | 2 +-
 net/batman-adv/netlink.c           | 8 ++++----
 net/batman-adv/translation-table.c | 2 +-
 net/batman-adv/types.h             | 2 +-
 5 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c
index a4d33ee0..4ee2b14d 100644
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -614,7 +614,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);
        }
 
diff --git a/net/batman-adv/mesh-interface.c b/net/batman-adv/mesh-interface.c
index d1f50b8b..0e63fad0 100644
--- a/net/batman-adv/mesh-interface.c
+++ b/net/batman-adv/mesh-interface.c
@@ -565,7 +565,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);
diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c
index 64e26313..711746c5 100644
--- a/net/batman-adv/netlink.c
+++ b/net/batman-adv/netlink.c
@@ -180,7 +180,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,
@@ -203,7 +203,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;
@@ -1021,7 +1021,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);
@@ -1109,7 +1109,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);
diff --git a/net/batman-adv/translation-table.c 
b/net/batman-adv/translation-table.c
index 8bfb2fd2..7df5490d 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -3767,7 +3767,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);
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index 0f861152..d4437dd7 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -1432,7 +1432,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;

-- 
2.47.3

Reply via email to