From nobody Sat Feb 7 06:14:05 2026 Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 21BEE2F6907 for ; Fri, 23 Jan 2026 20:39:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769200744; cv=none; b=OeoqZ/rR2hkvDsCl2+FV4YOFLFu2xK4n2Qbc5P6TyL44gSL0scLybUkqoLUX8kinXREM/01Q2qsYcQrSe9iFZHt72fmdw3b/iC4OQXKe12Q3Hb3FV2ASao86Cvuv4lC8aHrAZYyz+RkimAaEQSMKn6DWqscp2y1KWISjCXl0hZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769200744; c=relaxed/simple; bh=KgGdeSzgMIOPZZ7L41W1PW/HdF8nfGQLQXo6G0TUv4g=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=DE2LWZERUg+u6aSnZ/nh8FGvboArnYlAcf8NBE3Zqo4fRHik8c1iROesq35EUuK4SDx4juZXt37q074NWqD8d5WjyEaYvngeuX/SZdEB6uZ5anEKPLJ8sEU85CcmIj+pfNKc/2NiE7XUql6PZbwkBQD5SmC0xPFg7XDIOluEVSo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=T0G+fqC5; arc=none smtp.client-ip=209.85.215.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="T0G+fqC5" Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-c635559e1c3so676267a12.0 for ; Fri, 23 Jan 2026 12:39:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769200742; x=1769805542; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=UjIu3YoQL2Ii+Wh6+3qxOEv2+5UI6zI1XQ1vy+K6uTw=; b=T0G+fqC5eUAEA3mzTzd3ErCNUcluMG2yJ7YSf/MYInViNEQP1V+dTzLN5pEa1IrEUi imbGWNfvNYaa1PtSWlQXrdBROpRi7VPWE2F2PiMB3Kz0JGlqTCLfl86Msy6LuPSoDY6j 4jEzd/iiqS8v2XIehWZwdfAiLtDZGoo75Af27z7Vl7ly/fDLNVpXcecAw74WiUhjn8Q9 FxmLk8bTbII1X9CFTprGKnim8U2DreaIfwhG6gZ06R1RaMdz7NSRN/gE+QhTTZ1e/Anq wArvfaQjhh//JlZy4GmGGSYGPA7l/4hPh+s6MyBsUYlHyEq4/klGElmZoJ1LFHf7lcr6 CFiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769200742; x=1769805542; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=UjIu3YoQL2Ii+Wh6+3qxOEv2+5UI6zI1XQ1vy+K6uTw=; b=iYLaE91YoevJM5oQF3DfFBCO/l1J7qeYU4D7llkXKUDSt3nMzAyk5O5uIBWI3Trz76 Uv8IjUC/BHJRYzK4zvDUaiQuN2kIvQ67VA/qjy1z6dkQ0UqNzPh4IBFQ9j9CyUhK2eMc yFq4aR/IMT3X8GqCZWuElWTrcZ5iXOsS2sQD5AaAfDZ4t+7frScWJI/9jhIkIgeiaKNp OvGpdrlXltx8K2wzV2+I7X8noRgLxcvssG5Tgf0txPbonlQ+pnnPRoeL+9yxpPkwiK1x dPmaGUmzJOlUkx//f8iIeG2EZaGEI0mm5bsZfgDXPXS3q5yqgpyrwWPDmoZJuSDq8J0P Agng== X-Forwarded-Encrypted: i=1; AJvYcCWUYkCeoWQktLY+oFZcrfB2rAwUz1U3htuhXu36Cpz5T6vytXCXwwhtAd7PsLpNVaxaVOidPPmH70EyZWY=@vger.kernel.org X-Gm-Message-State: AOJu0Yxs8hhTl81FxeTTIA1G5qJ5uLTPGMj3TN/Za3Es4658tpGlhgnH 1IbQhihw2ccsX+mRT4p8kGEx6AefrDR2y+BFvb32OTxpo0z7QnDRZNsO X-Gm-Gg: AZuq6aIV3tnkHkr+BumfDcSDmyhBZt3a1fcIslub/ihHsK/uboOhdlcDJqoNcgrDYup POcmSoWieHqKW+NuQjUcFgvATVK+xeXhOMhFbQ5ygT0K3kTaFBnJ7zc6DKbQF5uEDDYN1VFRK2a 31i7HoAULfAUJMjl4vQ7xpkeUPgbSxXiCSKUbSRfZJSpr4N5c2uggQZno4jqJGChu4sHhT1Qc55 8/pHFynPmA2388DpbS4WNrxKHVHM1O3GsfgrF0VFaW/sWJ71xg0Or2e3PhHopGmwKVUp2s8XNzW hwtiYlAW9yox9PVALSnKMHeGYKn8tKxwYXQtYladrtQDMx7OkOg5IDpmjijjzBZPw3Dk6vneG0R Rg2IoQfQYcNb/U7IVMutm40MFaWv7kU6dZ8PtZvYDl1qiLqdgg7dS1qowxjCwlRml63svS7vCLk JRt3wrGC2lCMf8woRkK759SYunmVlDjYG6SpBPHhPk158qLb38DcognQ== X-Received: by 2002:a17:90a:d647:b0:34c:ab9b:76c4 with SMTP id 98e67ed59e1d1-3536a984e8bmr2903920a91.0.1769200742319; Fri, 23 Jan 2026 12:39:02 -0800 (PST) Received: from d.home.mmyangfl.tk ([2001:19f0:8001:1644:5400:5ff:fe3e:12b1]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3536f25c4c5sm1300810a91.6.2026.01.23.12.39.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jan 2026 12:39:01 -0800 (PST) From: David Yang To: linux-wireless@vger.kernel.org Cc: David Yang , Johannes Berg , linux-kernel@vger.kernel.org Subject: [PATCH wireless-next] wifi: mac80211: use u64_stats_t with u64_stats_sync properly Date: Sat, 24 Jan 2026 04:38:40 +0800 Message-ID: <20260123203845.2915525-1-mmyangfl@gmail.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On 64bit arches, struct u64_stats_sync is empty and provides no help against load/store tearing. Convert to u64_stats_t to ensure atomic operations. Signed-off-by: David Yang --- net/mac80211/rx.c | 8 ++++---- net/mac80211/sta_info.c | 22 +++++++++++++++++----- net/mac80211/sta_info.h | 4 ++-- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index e0ccd9749853..577c505a5d10 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -1880,7 +1880,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *= rx) link_sta->rx_stats.fragments++; =20 u64_stats_update_begin(&link_sta->rx_stats.syncp); - link_sta->rx_stats.bytes +=3D rx->skb->len; + u64_stats_add(&link_sta->rx_stats.bytes, rx->skb->len); u64_stats_update_end(&link_sta->rx_stats.syncp); =20 if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { @@ -2777,7 +2777,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) * frame, so count MSDUs. */ u64_stats_update_begin(&rx->link_sta->rx_stats.syncp); - rx->link_sta->rx_stats.msdu[rx->seqno_idx]++; + u64_stats_inc(&rx->link_sta->rx_stats.msdu[rx->seqno_idx]); u64_stats_update_end(&rx->link_sta->rx_stats.syncp); } =20 @@ -4868,8 +4868,8 @@ static void ieee80211_rx_8023(struct ieee80211_rx_dat= a *rx, * frame, so count MSDUs. */ u64_stats_update_begin(&stats->syncp); - stats->msdu[rx->seqno_idx]++; - stats->bytes +=3D orig_len; + u64_stats_inc(&stats->msdu[rx->seqno_idx]); + u64_stats_add(&stats->bytes, orig_len); u64_stats_update_end(&stats->syncp); =20 if (fast_rx->internal_forward) { diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 1a995bc301b1..22e8561ad6fc 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -360,7 +360,9 @@ static void sta_accumulate_removed_link_stats(struct st= a_info *sta, int link_id) struct link_sta_info *link_sta =3D wiphy_dereference(sta->local->hw.wiphy, sta->link[link_id]); struct ieee80211_link_data *link; + unsigned int start; int ac, tid; + u64 value; u32 thr; =20 for (ac =3D 0; ac < IEEE80211_NUM_ACS; ac++) { @@ -369,8 +371,13 @@ static void sta_accumulate_removed_link_stats(struct s= ta_info *sta, int link_id) sta->rem_link_stats.tx_bytes +=3D link_sta->tx_stats.bytes[ac]; } =20 + do { + start =3D u64_stats_fetch_begin(&link_sta->rx_stats.syncp); + value =3D u64_stats_read(&link_sta->rx_stats.bytes); + } while (u64_stats_fetch_retry(&link_sta->rx_stats.syncp, start)); + sta->rem_link_stats.rx_packets +=3D link_sta->rx_stats.packets; - sta->rem_link_stats.rx_bytes +=3D link_sta->rx_stats.bytes; + sta->rem_link_stats.rx_bytes +=3D value; sta->rem_link_stats.tx_retries +=3D link_sta->status_stats.retry_count; sta->rem_link_stats.tx_failed +=3D link_sta->status_stats.retry_failed; sta->rem_link_stats.rx_dropped_misc +=3D link_sta->rx_stats.dropped; @@ -380,8 +387,13 @@ static void sta_accumulate_removed_link_stats(struct s= ta_info *sta, int link_id) sta->rem_link_stats.expected_throughput +=3D thr; =20 for (tid =3D 0; tid < IEEE80211_NUM_TIDS; tid++) { - sta->rem_link_stats.pertid_stats.rx_msdu +=3D - link_sta->rx_stats.msdu[tid]; + do { + start =3D u64_stats_fetch_begin(&link_sta->rx_stats.syncp); + value =3D u64_stats_read(&link_sta->rx_stats.msdu[tid]); + } while (u64_stats_fetch_retry(&link_sta->rx_stats.syncp, + start)); + + sta->rem_link_stats.pertid_stats.rx_msdu +=3D value; sta->rem_link_stats.pertid_stats.tx_msdu +=3D link_sta->tx_stats.msdu[tid]; sta->rem_link_stats.pertid_stats.tx_msdu_retries +=3D @@ -2578,7 +2590,7 @@ static inline u64 sta_get_tidstats_msdu(struct ieee80= 211_sta_rx_stats *rxstats, =20 do { start =3D u64_stats_fetch_begin(&rxstats->syncp); - value =3D rxstats->msdu[tid]; + value =3D u64_stats_read(&rxstats->msdu[tid]); } while (u64_stats_fetch_retry(&rxstats->syncp, start)); =20 return value; @@ -2654,7 +2666,7 @@ static inline u64 sta_get_stats_bytes(struct ieee8021= 1_sta_rx_stats *rxstats) =20 do { start =3D u64_stats_fetch_begin(&rxstats->syncp); - value =3D rxstats->bytes; + value =3D u64_stats_read(&rxstats->bytes); } while (u64_stats_fetch_retry(&rxstats->syncp, start)); =20 return value; diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 5288d5286651..b1edf8ed102f 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -434,8 +434,8 @@ struct ieee80211_sta_rx_stats { s8 chain_signal_last[IEEE80211_MAX_CHAINS]; u32 last_rate; struct u64_stats_sync syncp; - u64 bytes; - u64 msdu[IEEE80211_NUM_TIDS + 1]; + u64_stats_t bytes; + u64_stats_t msdu[IEEE80211_NUM_TIDS + 1]; }; =20 /* --=20 2.51.0