[PATCH 03/11] fs: aio: Use acquire/release for ring->tail publication

From: Jinjie Ruan

Date: Tue Aug 25 2026 - 05:56:00 EST


Replace the smp_wmb() + WRITE_ONCE(ring->tail) and READ_ONCE(ring->tail)
+ smp_rmb() barrier pair with smp_store_release()/smp_load_acquire()
on `ring->tail`.

This expresses the publish/subscribe pattern more clearly and allows
architectures with native acquire/release instructions (e.g. arm64's
STLR/LDAR) to avoid the cost of full one-way barriers (DMB ISHST/ISHLD).

The release ensures event data written before updating ring->tail is
visible to readers that observe the new tail value via acquire, which
is exactly the ordering the barrier pair provided.

No functional change intended.

Assisted-by: DeepSeek:DeepSeek-V3
Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
---
fs/aio.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/fs/aio.c b/fs/aio.c
index d78acc69f487..4413c82688cc 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1206,13 +1206,12 @@ static void aio_complete(struct aio_kiocb *iocb)
/* after flagging the request as done, we
* must never even look at it again
*/
- smp_wmb(); /* make event visible before updating tail */
-
- ctx->tail = tail;
+ WRITE_ONCE(ctx->tail, tail);

ring = folio_address(ctx->ring_folios[0]);
head = ring->head;
- ring->tail = tail;
+ /* Make event visible before updating tail */
+ smp_store_release(&ring->tail, tail);
flush_dcache_folio(ctx->ring_folios[0]);

ctx->completed_events++;
@@ -1288,13 +1287,12 @@ static long aio_read_events_ring(struct kioctx *ctx,
/* Access to ->ring_folios here is protected by ctx->ring_lock. */
ring = folio_address(ctx->ring_folios[0]);
head = ring->head;
- tail = ring->tail;
-
/*
* Ensure that once we've read the current tail pointer, that
* we also see the events that were stored up to the tail.
+ * Pairs with smp_store_release() in aio_complete().
*/
- smp_rmb();
+ tail = smp_load_acquire(&ring->tail);

pr_debug("h%u t%u m%u\n", head, tail, ctx->nr_events);

--
2.34.1