From: Sven Eckelmann Date: Tue, 12 May 2026 17:37:05 +0000 (+0200) Subject: batman-adv: replace non-atomic packet_size_max with (READ|WRITE)_ONCE X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58020571b54f41ddd786eb96cb0deb66668453db;p=thirdparty%2Flinux.git batman-adv: replace non-atomic packet_size_max with (READ|WRITE)_ONCE The maximum packet size of an meshif is only accessed as plain loads/stores and does not require full atomic_t semantics. Convert to a native integer and replace its users with READ_ONCE()/WRITE_ONCE() to avoid load/store tearing. Signed-off-by: Sven Eckelmann --- diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c index 86e7d10864e2..bb3c31b5f259 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 #include #include #include @@ -629,7 +628,7 @@ out: * 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 7497f307c10d..b6797654b18a 100644 --- a/net/batman-adv/mesh-interface.c +++ b/net/batman-adv/mesh-interface.c @@ -779,7 +779,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 515f26ff8c26..e319b0796f7c 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -649,7 +649,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", @@ -3069,7 +3069,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); @@ -3932,7 +3932,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 58375c0a643b..7533d71b7372 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h @@ -1570,7 +1570,7 @@ struct batadv_priv { * multiple fragmented skbs or a single frame if fragmentation is * disabled */ - atomic_t packet_size_max; + int packet_size_max; /** * @frag_seqno: incremental counter to identify chains of egress