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 --- 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