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
