From e18504a4d378b4c9e1ee522ae7fc18cac8b1fc82 Mon Sep 17 00:00:00 2001 From: Anvik Loitongbam Date: Thu, 29 Oct 2026 20:17:45 +0530 Subject: [PATCH] io_uring/napi: clean up list traversal with list_for_each_entry_safe() Switch both loops to the standard list_for_each_entry_safe() pattern and remove the explanatory comment. Signed-off-by: Anvik Loitongbam Reviewed-by: Steven Rostedt Link: https://patch.msgid.link/20261029144745.23792-1-permissiontogallop@gmail.com Signed-off-by: Jens Axboe --- io_uring/napi.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/io_uring/napi.c b/io_uring/napi.c index 7e698720cd51..d299c89cfc3d 100644 --- a/io_uring/napi.c +++ b/io_uring/napi.c @@ -110,16 +110,10 @@ static int __io_napi_del_id(struct io_ring_ctx *ctx, unsigned int napi_id) static void __io_napi_remove_stale(struct io_ring_ctx *ctx) { - struct io_napi_entry *e; + struct io_napi_entry *e, *next; guard(spinlock)(&ctx->napi_lock); - /* - * list_for_each_entry_safe() is not required as long as: - * 1. list_del_rcu() does not reset the deleted node next pointer - * 2. kfree_rcu() delays the memory freeing until the next quiescent - * state - */ - list_for_each_entry(e, &ctx->napi_list, list) { + list_for_each_entry_safe(e, next, &ctx->napi_list, list) { if (time_after(jiffies, READ_ONCE(e->timeout))) { list_del_rcu(&e->list); hash_del_rcu(&e->node); @@ -264,10 +258,10 @@ void io_napi_init(struct io_ring_ctx *ctx) */ void io_napi_free(struct io_ring_ctx *ctx) { - struct io_napi_entry *e; + struct io_napi_entry *e, *next; guard(spinlock)(&ctx->napi_lock); - list_for_each_entry(e, &ctx->napi_list, list) { + list_for_each_entry_safe(e, next, &ctx->napi_list, list) { hash_del_rcu(&e->node); kfree_rcu(e, rcu); }