io_uring: deduplicate caches deallocation
authorPavel Begunkov <asml.silence@gmail.com>
Fri, 31 Jan 2025 17:27:02 +0000 (17:27 +0000)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Feb 2025 12:34:45 +0000 (05:34 -0700)
Add a function that frees all ring caches since we already have two
spots repeating the same thing and it's easy to miss it and change only
one of them.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/b6b0125677c58bdff99eda91ab320137406e8562.1738342562.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index ceacf6230e342a04fbad4344c6508dc7a9172ca2..9fade03ce0d97bcef1fe7bc78f384484d13071e9 100644 (file)
@@ -282,6 +282,16 @@ static int io_alloc_hash_table(struct io_hash_table *table, unsigned bits)
        return 0;
 }
 
+static void io_free_alloc_caches(struct io_ring_ctx *ctx)
+{
+       io_alloc_cache_free(&ctx->apoll_cache, kfree);
+       io_alloc_cache_free(&ctx->netmsg_cache, io_netmsg_cache_free);
+       io_alloc_cache_free(&ctx->rw_cache, io_rw_cache_free);
+       io_alloc_cache_free(&ctx->uring_cache, kfree);
+       io_alloc_cache_free(&ctx->msg_cache, kfree);
+       io_futex_cache_free(ctx);
+}
+
 static __cold struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p)
 {
        struct io_ring_ctx *ctx;
@@ -360,12 +370,7 @@ static __cold struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p)
 free_ref:
        percpu_ref_exit(&ctx->refs);
 err:
-       io_alloc_cache_free(&ctx->apoll_cache, kfree);
-       io_alloc_cache_free(&ctx->netmsg_cache, io_netmsg_cache_free);
-       io_alloc_cache_free(&ctx->rw_cache, io_rw_cache_free);
-       io_alloc_cache_free(&ctx->uring_cache, kfree);
-       io_alloc_cache_free(&ctx->msg_cache, kfree);
-       io_futex_cache_free(ctx);
+       io_free_alloc_caches(ctx);
        kvfree(ctx->cancel_table.hbs);
        xa_destroy(&ctx->io_bl_xa);
        kfree(ctx);
@@ -2702,12 +2707,7 @@ static __cold void io_ring_ctx_free(struct io_ring_ctx *ctx)
        io_sqe_files_unregister(ctx);
        io_cqring_overflow_kill(ctx);
        io_eventfd_unregister(ctx);
-       io_alloc_cache_free(&ctx->apoll_cache, kfree);
-       io_alloc_cache_free(&ctx->netmsg_cache, io_netmsg_cache_free);
-       io_alloc_cache_free(&ctx->rw_cache, io_rw_cache_free);
-       io_alloc_cache_free(&ctx->uring_cache, kfree);
-       io_alloc_cache_free(&ctx->msg_cache, kfree);
-       io_futex_cache_free(ctx);
+       io_free_alloc_caches(ctx);
        io_destroy_buffers(ctx);
        io_free_region(ctx, &ctx->param_region);
        mutex_unlock(&ctx->uring_lock);