The maximum packet size of an meshif is only accessed as plain loads/stores
and does not require full atomic_t semantics. Convert to an native integer
and replace its users with READ_ONCE()/WRITE_ONCE() to avoid load/store
tearing.

Signed-off-by: Sven Eckelmann <[email protected]>
---
 net/batman-adv/hard-interface.c    | 3 +--
 net/batman-adv/mesh-interface.c    | 2 +-
 net/batman-adv/translation-table.c | 6 +++---
 net/batman-adv/types.h             | 2 +-
 4 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index fb90779d..6a2366b7 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -7,7 +7,6 @@
 #include "hard-interface.h"
 #include "main.h"
 
-#include <linux/atomic.h>
 #include <linux/bug.h>
 #include <linux/byteorder/generic.h>
 #include <linux/compiler.h>
@@ -612,7 +611,7 @@ int batadv_hardif_min_mtu(struct net_device *mesh_iface)
         * overhead). For example, this value is used by TT to compute the
         * maximum local table size
         */
-       atomic_set(&bat_priv->packet_size_max, min_mtu);
+       WRITE_ONCE(bat_priv->packet_size_max, min_mtu);
 
        /* the real mesh-interface MTU is computed by removing the payload
         * overhead from the maximum amount of bytes that was just computed.
diff --git a/net/batman-adv/mesh-interface.c b/net/batman-adv/mesh-interface.c
index 9c53552a..232c7b2c 100644
--- a/net/batman-adv/mesh-interface.c
+++ b/net/batman-adv/mesh-interface.c
@@ -777,7 +777,7 @@ static int batadv_meshif_init_late(struct net_device *dev)
        WRITE_ONCE(bat_priv->log_level, 0);
 #endif
        WRITE_ONCE(bat_priv->fragmentation, 1);
-       atomic_set(&bat_priv->packet_size_max, BATADV_MAX_MTU);
+       WRITE_ONCE(bat_priv->packet_size_max, BATADV_MAX_MTU);
        atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
        atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
 
diff --git a/net/batman-adv/translation-table.c 
b/net/batman-adv/translation-table.c
index 7df5490d..e5bf5a43 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -689,7 +689,7 @@ bool batadv_tt_local_add(struct net_device *mesh_iface, 
const u8 *addr,
        /* Ignore the client if we cannot send it in a full table response. */
        table_size = batadv_tt_local_table_transmit_size(bat_priv);
        table_size += batadv_tt_len(1);
-       packet_size_max = atomic_read(&bat_priv->packet_size_max);
+       packet_size_max = READ_ONCE(bat_priv->packet_size_max);
        if (table_size > packet_size_max) {
                net_ratelimited_function(batadv_info, mesh_iface,
                                         "Local translation table size (%i) 
exceeds maximum packet size (%i); Ignoring new local tt entry: %pM\n",
@@ -3106,7 +3106,7 @@ static bool batadv_send_other_tt_response(struct 
batadv_priv *bat_priv,
 
        /* Don't send the response, if larger than fragmented packet. */
        tt_len = sizeof(struct batadv_unicast_tvlv_packet) + tvlv_len;
-       if (tt_len > atomic_read(&bat_priv->packet_size_max)) {
+       if (tt_len > READ_ONCE(bat_priv->packet_size_max)) {
                net_ratelimited_function(batadv_info, bat_priv->mesh_iface,
                                         "Ignoring TT_REQUEST from %pM; 
Response size exceeds max packet size.\n",
                                         res_dst_orig_node->orig);
@@ -3969,7 +3969,7 @@ bool batadv_tt_add_temporary_global_entry(struct 
batadv_priv *bat_priv,
 void batadv_tt_local_resize_to_mtu(struct net_device *mesh_iface)
 {
        struct batadv_priv *bat_priv = netdev_priv(mesh_iface);
-       int packet_size_max = atomic_read(&bat_priv->packet_size_max);
+       int packet_size_max = READ_ONCE(bat_priv->packet_size_max);
        int table_size, timeout = BATADV_TT_LOCAL_TIMEOUT / 2;
        bool reduced = false;
 
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index fcf879ce..913273ce 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -1543,7 +1543,7 @@ struct batadv_priv {
         *  multiple fragmented skbs or a single frame if fragmentation is
         *  disabled
         */
-       atomic_t packet_size_max;
+       u32 packet_size_max;
 
        /**
         * @frag_seqno: incremental counter to identify chains of egress

-- 
2.47.3

Reply via email to