Commit 0d83b8a9 authored by Caleb Sander Mateos's avatar Caleb Sander Mateos Committed by Jens Axboe
Browse files

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: default avatarCaleb Sander Mateos <csander@purestorage.com>
Suggested-by: default avatarLi Zetao <lizetao1@huawei.com>
Link: https://lore.kernel.org/r/20250304194814.2346705-1-csander@purestorage.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent fe21a453
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -68,4 +68,10 @@ static inline void *io_cache_alloc(struct io_alloc_cache *cache, gfp_t gfp)
	return io_cache_alloc_new(cache, gfp);
}

static inline void io_cache_free(struct io_alloc_cache *cache, void *obj)
{
	if (!io_alloc_cache_put(cache, obj))
		kfree(obj);
}

#endif
+1 −3
Original line number Diff line number Diff line
@@ -53,12 +53,10 @@ static void __io_futex_complete(struct io_kiocb *req, io_tw_token_t tw)

static void io_futex_complete(struct io_kiocb *req, io_tw_token_t tw)
{
	struct io_futex_data *ifd = req->async_data;
	struct io_ring_ctx *ctx = req->ctx;

	io_tw_lock(ctx, tw);
	if (!io_alloc_cache_put(&ctx->futex_cache, ifd))
		kfree(ifd);
	io_cache_free(&ctx->futex_cache, req->async_data);
	__io_futex_complete(req, tw);
}

+1 −2
Original line number Diff line number Diff line
@@ -1422,8 +1422,7 @@ static void io_free_batch_list(struct io_ring_ctx *ctx,

				if (apoll->double_poll)
					kfree(apoll->double_poll);
				if (!io_alloc_cache_put(&ctx->apoll_cache, apoll))
					kfree(apoll);
				io_cache_free(&ctx->apoll_cache, apoll);
				req->flags &= ~REQ_F_POLLED;
			}
			if (req->flags & IO_REQ_LINK_FLAGS)
+5 −10
Original line number Diff line number Diff line
@@ -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 @@ static struct io_rsrc_node *io_sqe_buffer_register(struct io_ring_ctx *ctx,
	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);