[lvc-project] [PATCH 6.12] io_uring/napi: fix io_napi_entry RCU accesses

Fedor Pchelkin pchelkin at ispras.ru
Mon Nov 17 15:42:39 MSK 2025


On Wed, 12. Nov 14:37, Stepan Artuhov wrote:
> From: Olivier Langlois <olivier at trillion01.com>
> 
> [Upstream commit 45b3941d09d13b3503309be1f023b83deaf69b4d ]

К формату этой строки чувствительны скрипты по обработке бэкпорт-патчей.
Допускается две формы, просьба писать одну из них по возможности без
опечаток:
https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html#option-3

Ещё комментарий см. ниже.

> 
> correct 3 RCU structures modifications that were not using the RCU
> functions to make their update.
> 
> Cc: Jens Axboe <axboe at kernel.dk>
> Cc: Pavel Begunkov <asml.silence at gmail.com>
> Cc: io-uring at vger.kernel.org
> Cc: linux-kernel at vger.kernel.org
> Cc: lvc-project at linuxtesting.org
> Signed-off-by: Olivier Langlois <olivier at trillion01.com>
> Link: https://lore.kernel.org/r/9f53b5169afa8c7bf3665a0b19dc2f7061173530.1728828877.git.olivier@trillion01.com
> Signed-off-by: Jens Axboe <axboe at kernel.dk>
> [Stepan Artuhov: cherry-picked a commit]
> Signed-off-by: Stepan Artuhov <s.artuhov at tssltd.ru>
> ---
>  io_uring/napi.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/io_uring/napi.c b/io_uring/napi.c
> index d0cf694d0172..fa959fd32042 100644
> --- a/io_uring/napi.c
> +++ b/io_uring/napi.c
> @@ -81,19 +81,24 @@ void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock)
>  	}
>  
>  	hlist_add_tail_rcu(&e->node, hash_list);
> -	list_add_tail(&e->list, &ctx->napi_list);
> +	list_add_tail_rcu(&e->list, &ctx->napi_list);
>  	spin_unlock(&ctx->napi_lock);
>  }
>  
>  static void __io_napi_remove_stale(struct io_ring_ctx *ctx)
>  {
>  	struct io_napi_entry *e;
> -	unsigned int i;
>  
>  	spin_lock(&ctx->napi_lock);
> -	hash_for_each(ctx->napi_ht, i, e, node) {
> -		if (time_after(jiffies, e->timeout)) {
> -			list_del(&e->list);
> +	/*
> +	 * 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) {
> +		if (time_after(jiffies, READ_ONCE(e->timeout))) {

Переносимый сейчас коммит не делал перевод к READ_ONCE().  Это осуществил
коммит 2f3cc8e441c9 ("io_uring/napi: protect concurrent io_napi_entry
timeout accesses").  Если хочется сделать перевод к READ_ONCE() - оно
видимо не будет лишним - то стоит перенести упомянутый коммит отдельным
патчем.  Оформить это можно в виде серии из двух патчей: первый -
бэкпорт 2f3cc8e441c9, второй - бэкпорт 45b3941d09d1.

Отправить просьба только по адресу lvc-patches at linuxtesting.org.  Межд.
сообщество не реагирует на бэкпорты.

Перед финальной отправкой git send-email печатает список адресатов, кому
пойдёт патч.  Там автоматически окажутся ещё адресаты из тела патча, из
можно убрать добавкой опции --suppress-cc
https://portal.linuxtesting.ru/How-to-send-patches-to-kernel.html#Отправка

> +			list_del_rcu(&e->list);
>  			hash_del_rcu(&e->node);
>  			kfree_rcu(e, rcu);
>  		}
> @@ -204,13 +209,13 @@ void io_napi_init(struct io_ring_ctx *ctx)
>  void io_napi_free(struct io_ring_ctx *ctx)
>  {
>  	struct io_napi_entry *e;
> -	unsigned int i;
>  
>  	spin_lock(&ctx->napi_lock);
> -	hash_for_each(ctx->napi_ht, i, e, node) {
> +	list_for_each_entry(e, &ctx->napi_list, list) {
>  		hash_del_rcu(&e->node);
>  		kfree_rcu(e, rcu);
>  	}
> +	INIT_LIST_HEAD_RCU(&ctx->napi_list);
>  	spin_unlock(&ctx->napi_lock);
>  }
>  
> -- 
> 2.39.5



More information about the lvc-project mailing list