The mesh state is only accessed as plain loads/stores and does not require
full atomic_t semantics. Convert to an enum and replace its users with
READ_ONCE()/WRITE_ONCE() to avoid load/store tearing.

Signed-off-by: Sven Eckelmann <[email protected]>
---
 net/batman-adv/bat_iv_ogm.c     |  2 +-
 net/batman-adv/bat_v_elp.c      |  2 +-
 net/batman-adv/bat_v_ogm.c      |  2 +-
 net/batman-adv/main.c           | 20 ++++++++++----------
 net/batman-adv/mesh-interface.c |  6 +++---
 net/batman-adv/send.c           |  2 +-
 net/batman-adv/tp_meter.c       |  6 +++---
 net/batman-adv/types.h          |  2 +-
 8 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
index c7751e0a..abd752db 100644
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -1731,7 +1731,7 @@ static void 
batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work)
                                   delayed_work);
        bat_priv = netdev_priv(forw_packet->if_incoming->mesh_iface);
 
-       if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
+       if (READ_ONCE(bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
                dropped = true;
                goto out;
        }
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
index 075a58dd..a94e31a7 100644
--- a/net/batman-adv/bat_v_elp.c
+++ b/net/batman-adv/bat_v_elp.c
@@ -305,7 +305,7 @@ static void batadv_v_elp_periodic_work(struct work_struct 
*work)
        hard_iface = container_of(bat_v, struct batadv_hard_iface, bat_v);
        bat_priv = netdev_priv(hard_iface->mesh_iface);
 
-       if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
+       if (READ_ONCE(bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
                goto out;
 
        /* we are in the process of shutting this interface down */
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c
index 5e187fc8..4ed0bb5b 100644
--- a/net/batman-adv/bat_v_ogm.c
+++ b/net/batman-adv/bat_v_ogm.c
@@ -271,7 +271,7 @@ static void batadv_v_ogm_send_meshif(struct batadv_priv 
*bat_priv)
 
        lockdep_assert_held(&bat_priv->bat_v.ogm_buff_mutex);
 
-       if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
+       if (READ_ONCE(bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
                goto out;
 
        ogm_buff = bat_priv->bat_v.ogm_buff;
diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c
index 4ee2b14d..4d83577f 100644
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -187,31 +187,31 @@ int batadv_mesh_init(struct net_device *mesh_iface)
 
        ret = batadv_originator_init(bat_priv);
        if (ret < 0) {
-               atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+               WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
                goto err_orig;
        }
 
        ret = batadv_tt_init(bat_priv);
        if (ret < 0) {
-               atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+               WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
                goto err_tt;
        }
 
        ret = batadv_v_mesh_init(bat_priv);
        if (ret < 0) {
-               atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+               WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
                goto err_v;
        }
 
        ret = batadv_bla_init(bat_priv);
        if (ret < 0) {
-               atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+               WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
                goto err_bla;
        }
 
        ret = batadv_dat_init(bat_priv);
        if (ret < 0) {
-               atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+               WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
                goto err_dat;
        }
 
@@ -219,7 +219,7 @@ int batadv_mesh_init(struct net_device *mesh_iface)
        batadv_mcast_init(bat_priv);
 
        atomic_set(&bat_priv->gw.reselect, 0);
-       atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE);
+       WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_ACTIVE);
 
        return 0;
 
@@ -233,7 +233,7 @@ int batadv_mesh_init(struct net_device *mesh_iface)
        batadv_originator_free(bat_priv);
 err_orig:
        batadv_purge_outstanding_packets(bat_priv, NULL);
-       atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
+       WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_INACTIVE);
 
        return ret;
 }
@@ -246,7 +246,7 @@ void batadv_mesh_free(struct net_device *mesh_iface)
 {
        struct batadv_priv *bat_priv = netdev_priv(mesh_iface);
 
-       atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+       WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
 
        batadv_purge_outstanding_packets(bat_priv, NULL);
        batadv_tp_stop_all(bat_priv);
@@ -277,7 +277,7 @@ void batadv_mesh_free(struct net_device *mesh_iface)
        free_percpu(bat_priv->bat_counters);
        bat_priv->bat_counters = NULL;
 
-       atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
+       WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_INACTIVE);
 }
 
 /**
@@ -441,7 +441,7 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct 
net_device *dev,
 
        bat_priv = netdev_priv(hard_iface->mesh_iface);
 
-       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
+       if (READ_ONCE(bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto err_free;
 
        /* discard frames on not active interfaces */
diff --git a/net/batman-adv/mesh-interface.c b/net/batman-adv/mesh-interface.c
index 0e63fad0..9c53552a 100644
--- a/net/batman-adv/mesh-interface.c
+++ b/net/batman-adv/mesh-interface.c
@@ -123,7 +123,7 @@ static int batadv_interface_set_mac_addr(struct net_device 
*dev, void *p)
        eth_hw_addr_set(dev, addr->sa_data);
 
        /* only modify transtable if it has been initialized before */
-       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
+       if (READ_ONCE(bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                return 0;
 
        rcu_read_lock();
@@ -190,7 +190,7 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
        int network_offset = ETH_HLEN;
        __be16 proto;
 
-       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
+       if (READ_ONCE(bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto dropped;
 
        /* reset control block to avoid left overs from previous users */
@@ -781,7 +781,7 @@ static int batadv_meshif_init_late(struct net_device *dev)
        atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
        atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
 
-       atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
+       WRITE_ONCE(bat_priv->mesh_state, BATADV_MESH_INACTIVE);
        atomic_set(&bat_priv->bcast_seqno, 1);
        atomic_set(&bat_priv->tt.vn, 0);
        atomic_set(&bat_priv->tt.ogm_append_cnt, 0);
diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c
index 62ae98ee..c7e86c83 100644
--- a/net/batman-adv/send.c
+++ b/net/batman-adv/send.c
@@ -1047,7 +1047,7 @@ static void batadv_send_outstanding_bcast_packet(struct 
work_struct *work)
                                   delayed_work);
        bat_priv = netdev_priv(forw_packet->if_incoming->mesh_iface);
 
-       if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
+       if (READ_ONCE(bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
                dropped = true;
                goto out;
        }
diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index 1fd15260..fef98fbe 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -963,7 +963,7 @@ void batadv_tp_start(struct batadv_priv *bat_priv, const u8 
*dst,
 
        /* look for an already existing test towards this node */
        spin_lock_bh(&bat_priv->tp_list_lock);
-       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE) {
+       if (READ_ONCE(bat_priv->mesh_state) != BATADV_MESH_ACTIVE) {
                spin_unlock_bh(&bat_priv->tp_list_lock);
                batadv_tp_batctl_error_notify(BATADV_TP_REASON_DST_UNREACHABLE,
                                              dst, bat_priv, session_cookie);
@@ -1357,7 +1357,7 @@ batadv_tp_init_recv(struct batadv_priv *bat_priv,
        struct batadv_tp_vars *tp_vars = NULL;
 
        spin_lock_bh(&bat_priv->tp_list_lock);
-       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
+       if (READ_ONCE(bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto out_unlock;
 
        tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig,
@@ -1495,7 +1495,7 @@ void batadv_tp_meter_recv(struct batadv_priv *bat_priv, 
struct sk_buff *skb)
 {
        struct batadv_icmp_tp_packet *icmp;
 
-       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
+       if (READ_ONCE(bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto out;
 
        icmp = (struct batadv_icmp_tp_packet *)skb->data;
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index d5f9d130..d2dea899 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -1477,7 +1477,7 @@ struct batadv_priv {
         * @mesh_state: current status of the mesh
         *  (inactive/active/deactivating)
         */
-       atomic_t mesh_state;
+       enum batadv_mesh_state mesh_state;
 
        /** @mesh_iface: net device which holds this struct as private data */
        struct net_device *mesh_iface;

-- 
2.47.3

Reply via email to