aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/io_uring/rsrc.c
diff options
context:
space:
mode:
authorCaleb Sander Mateos <csander@purestorage.com>2025-03-04 12:48:12 -0700
committerJens Axboe <axboe@kernel.dk>2025-03-05 07:38:55 -0700
commit0d83b8a9f180436a84fbdeb575696b0c3ae0ac0c (patch)
tree63f4ee653c55050eea934f788e228f0607086dbe /io_uring/rsrc.c
parentio_uring/rsrc: skip NULL file/buffer checks in io_free_rsrc_node() (diff)
downloadwireguard-linux-0d83b8a9f180436a84fbdeb575696b0c3ae0ac0c.tar.xz
wireguard-linux-0d83b8a9f180436a84fbdeb575696b0c3ae0ac0c.zip
io_uring: introduce io_cache_free() helper
Add a helper function io_cache_free() that returns an allocation to a io_alloc_cache, falling back on kfree() if the io_alloc_cache is full. This is the inverse of io_cache_alloc(), which takes an allocation from an io_alloc_cache and falls back on kmalloc() if the cache is empty. Convert 4 callers to use the helper. Signed-off-by: Caleb Sander Mateos <csander@purestorage.com> Suggested-by: Li Zetao <lizetao1@huawei.com> Link: https://lore.kernel.org/r/20250304194814.2346705-1-csander@purestorage.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/rsrc.c')
-rw-r--r--io_uring/rsrc.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c
index 3fb1bd616eef..5dd1e0827559 100644
--- a/io_uring/rsrc.c
+++ b/io_uring/rsrc.c
@@ -124,8 +124,9 @@ static struct io_mapped_ubuf *io_alloc_imu(struct io_ring_ctx *ctx,
static void io_free_imu(struct io_ring_ctx *ctx, struct io_mapped_ubuf *imu)
{
- if (imu->nr_bvecs > IO_CACHED_BVECS_SEGS ||
- !io_alloc_cache_put(&ctx->imu_cache, imu))
+ if (imu->nr_bvecs <= IO_CACHED_BVECS_SEGS)
+ io_cache_free(&ctx->imu_cache, imu);
+ else
kvfree(imu);
}
@@ -487,12 +488,6 @@ int io_files_update(struct io_kiocb *req, unsigned int issue_flags)
return IOU_OK;
}
-static void io_free_node(struct io_ring_ctx *ctx, struct io_rsrc_node *node)
-{
- if (!io_alloc_cache_put(&ctx->node_cache, node))
- kfree(node);
-}
-
void io_free_rsrc_node(struct io_ring_ctx *ctx, struct io_rsrc_node *node)
{
if (node->tag)
@@ -510,7 +505,7 @@ void io_free_rsrc_node(struct io_ring_ctx *ctx, struct io_rsrc_node *node)
break;
}
- io_free_node(ctx, node);
+ io_cache_free(&ctx->node_cache, node);
}
int io_sqe_files_unregister(struct io_ring_ctx *ctx)
@@ -835,7 +830,7 @@ done:
if (ret) {
if (imu)
io_free_imu(ctx, imu);
- io_free_node(ctx, node);
+ io_cache_free(&ctx->node_cache, node);
node = ERR_PTR(ret);
}
kvfree(pages);