Commit 5c727ce0 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

io_uring/zcrx: cache fallback availability in zcrx ctx



Store a flag in struct io_zcrx_ifq telling if the backing memory is
normal page or dmabuf based. It was looking it up from the area, however
it logically allocates from the zcrx ctx and not a particular area, and
once we add more than one area it'll become a mess.

Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://patch.msgid.link/65e75408a7758fe7e60fae89b7a8d5ae4857f515.1774261953.git.asml.silence@gmail.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f0b92207
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -423,8 +423,13 @@ static void io_zcrx_free_area(struct io_zcrx_ifq *ifq,
static int io_zcrx_append_area(struct io_zcrx_ifq *ifq,
				struct io_zcrx_area *area)
{
	bool kern_readable = !area->mem.is_dmabuf;

	if (WARN_ON_ONCE(ifq->area))
		return -EINVAL;
	if (WARN_ON_ONCE(ifq->kern_readable != kern_readable))
		return -EINVAL;

	ifq->area = area;
	return 0;
}
@@ -882,6 +887,8 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
	if (ret)
		goto err;

	ifq->kern_readable = !(area.flags & IORING_ZCRX_AREA_DMABUF);

	if (!(reg.flags & ZCRX_REG_NODEV)) {
		ret = zcrx_register_netdev(ifq, &reg, &area);
		if (ret)
@@ -1298,7 +1305,7 @@ static struct net_iov *io_alloc_fallback_niov(struct io_zcrx_ifq *ifq)
	struct io_zcrx_area *area = ifq->area;
	struct net_iov *niov = NULL;

	if (area->mem.is_dmabuf)
	if (!ifq->kern_readable)
		return NULL;

	scoped_guard(spinlock_bh, &area->freelist_lock)
+1 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ struct io_zcrx_ifq {
	unsigned			niov_shift;
	struct user_struct		*user;
	struct mm_struct		*mm_account;
	bool				kern_readable;

	struct zcrx_rq			rq ____cacheline_aligned_in_smp;