[PATCH net-next 1/4] eth: mpnic: use WRITE_ONCE() for BDQ head and tail updates

From: Daniel Zahka

Date: Thu Oct 01 2026 - 13:36:47 EST


Convert writes to BDQ ring head and tail in the NAPI path to
WRITE_ONCE(), so that a buffer NAPI depletion check task later in the
series can READ_ONCE() those fields from a workqueue outside of NAPI.
The remaining writers in mpnic_enable_bdq() and mpnic_clean_bdq() run
with NAPI disabled and the instance lock, so don't bother converting
them. The NAPI depletion check later in the series will run under the
instance lock.

Signed-off-by: Daniel Zahka <daniel.zahka@xxxxxxxxx>
---
drivers/net/ethernet/meta/mpnic/mpnic_txrx.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c
index edb07b7f334b..49061c7316d5 100644
--- a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c
+++ b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.c
@@ -384,7 +384,7 @@ static unsigned int __mpnic_fill_bdq(struct mpnic_ring *bdq)
static void __mpnic_bdq_commit_tail(struct mpnic_ring *bdq, unsigned int tail)
{
if (bdq->tail != tail) {
- bdq->tail = tail;
+ WRITE_ONCE(bdq->tail, tail);

writeq(tail, bdq->doorbell);
}
@@ -483,7 +483,7 @@ mpnic_pkt_prepare(u64 rcd, struct mpnic_rcq_state *state,
pg_start = mpnic_hdr_pg_start(pg_off);

page = mpnic_page_pool_get(&state->hdr, &qt->sub0, pg_idx);
- qt->sub0.head = (pg_idx + 1) & qt->sub0.size_mask;
+ WRITE_ONCE(qt->sub0.head, (pg_idx + 1) & qt->sub0.size_mask);

/* Short-cut the end calculation if the page is fully consumed */
pg_end = fin ? page_size(page) : mpnic_hdr_pg_end(pg_off, len);
@@ -513,7 +513,7 @@ mpnic_add_rx_frag(u64 rcd, struct mpnic_rcq_state *state,
struct page *page;

page = mpnic_page_pool_get(&state->payld, &qt->sub1, pg_idx);
- qt->sub1.head = (pg_idx + 1) & qt->sub1.size_mask;
+ WRITE_ONCE(qt->sub1.head, (pg_idx + 1) & qt->sub1.size_mask);

truesz = (fin ? page_size(page) : ALIGN(pg_off + len, 128)) - pg_off;


--
2.52.0