From: Jason Xing <kerneljasonxing@gmail.com>
To: nbd@nbd.name, lorenzo@kernel.org, ryder.lee@mediatek.com,
shayne.chen@mediatek.com, sean.wang@mediatek.com,
matthias.bgg@gmail.com, angelogioacchino.delregno@collabora.com,
akpm@linux-foundation.org, axboe@kernel.dk
Cc: linux-wireless@vger.kernel.org, Jason Xing <kernelxing@tencent.com>
Subject: [PATCH 3/3] wifi: mt76: mt7996: use relay_subbuf_avail() to fix stale fwlog reads
Date: Sun, 31 May 2026 11:40:10 +0800 [thread overview]
Message-ID: <20260531034010.85002-4-kerneljasonxing@gmail.com> (raw)
In-Reply-To: <20260531034010.85002-1-kerneljasonxing@gmail.com>
From: Jason Xing <kernelxing@tencent.com>
relay_reserve() advances buf->offset before the caller writes data.
Since relay_file_read() uses buf->offset as the readable upper bound
of the active sub-buffer, a concurrent reader can observe the
reserved-but-not-yet-written region, resulting in stale data.
WRITER READER (active sub-buf)
------ ------
relay_reserve(4+L)
buf->offset += 4+L ---+
*(u32*)dest = L | (offset already exposes the slot)
+--> read(&len, 4) => L (VALID!)
<<preempted>> read(buf, L) => STALE data X
memcpy(dest+4, ..., L)
[payload written - too late]
The userspace reader [1] uses poll() + read(&len, 4) + read(buf, len),
which is racy against the relay_reserve() window described above.
Switch to relay_subbuf_avail() + __relay_write() so the offset only
advances after each chunk is copied.
[1] https://github.com/openwrt/mt76/blob/master/tools/fwlog.c
Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: Jason Xing <kernelxing@tencent.com>
---
.../wireless/mediatek/mt76/mt7996/debugfs.c | 25 +++++++++----------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c
index 34af800964d1..82f59a7eb508 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c
@@ -914,22 +914,21 @@ mt7996_debugfs_write_fwlog(struct mt7996_dev *dev, const void *hdr, int hdrlen,
{
static DEFINE_SPINLOCK(lock);
unsigned long flags;
- void *dest;
+ u32 rec_len = len;
+
+ if (hdr)
+ rec_len += hdrlen;
spin_lock_irqsave(&lock, flags);
- dest = relay_reserve(dev->relay_fwlog, hdrlen + len + 4);
- if (dest) {
- *(u32 *)dest = hdrlen + len;
- dest += 4;
-
- if (hdrlen) {
- memcpy(dest, hdr, hdrlen);
- dest += hdrlen;
- }
+ if (!relay_subbuf_avail(dev->relay_fwlog, sizeof(rec_len) + rec_len))
+ goto out;
- memcpy(dest, data, len);
- relay_flush(dev->relay_fwlog);
- }
+ __relay_write(dev->relay_fwlog, &rec_len, sizeof(rec_len));
+ if (hdr)
+ __relay_write(dev->relay_fwlog, hdr, hdrlen);
+ __relay_write(dev->relay_fwlog, data, len);
+ relay_flush(dev->relay_fwlog);
+out:
spin_unlock_irqrestore(&lock, flags);
}
--
2.43.7
next prev parent reply other threads:[~2026-05-31 3:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-31 3:40 [PATCH 0/3] wifi: mt76: use __relay_write to avoid race issues Jason Xing
2026-05-31 3:40 ` [PATCH 1/3] relayfs: introduce relay_subbuf_avail() Jason Xing
2026-05-31 3:40 ` [PATCH 2/3] wifi: mt76: mt7915: use relay_subbuf_avail() to fix stale fwlog reads Jason Xing
2026-05-31 3:40 ` Jason Xing [this message]
2026-05-31 5:58 ` [PATCH 0/3] wifi: mt76: use __relay_write to avoid race issues Jason Xing
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260531034010.85002-4-kerneljasonxing@gmail.com \
--to=kerneljasonxing@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=angelogioacchino.delregno@collabora.com \
--cc=axboe@kernel.dk \
--cc=kernelxing@tencent.com \
--cc=linux-wireless@vger.kernel.org \
--cc=lorenzo@kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=nbd@nbd.name \
--cc=ryder.lee@mediatek.com \
--cc=sean.wang@mediatek.com \
--cc=shayne.chen@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox