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

io_uring/zcrx: introduce IORING_REGISTER_ZCRX_CTRL



It'll be annoying and take enough of boilerplate code to implement
new zcrx features as separate io_uring register opcode. Introduce
IORING_REGISTER_ZCRX_CTRL that will multiplex such calls to zcrx.
Note, there are no real users of the opcode in this patch.

Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 1b8b5d03
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -697,6 +697,9 @@ enum io_uring_register_op {
	/* query various aspects of io_uring, see linux/io_uring/query.h */
	IORING_REGISTER_QUERY			= 35,

	/* auxiliary zcrx configuration, see enum zcrx_ctrl_op */
	IORING_REGISTER_ZCRX_CTRL		= 36,

	/* this goes last */
	IORING_REGISTER_LAST,

@@ -1078,6 +1081,16 @@ struct io_uring_zcrx_ifq_reg {
	__u64	__resv[3];
};

enum zcrx_ctrl_op {
	__ZCRX_CTRL_LAST,
};

struct zcrx_ctrl {
	__u32	zcrx_id;
	__u32	op; /* see enum zcrx_ctrl_op */
	__u64	__resv[8];
};

#ifdef __cplusplus
}
#endif
+3 −0
Original line number Diff line number Diff line
@@ -815,6 +815,9 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
	case IORING_REGISTER_QUERY:
		ret = io_query(ctx, arg, nr_args);
		break;
	case IORING_REGISTER_ZCRX_CTRL:
		ret = io_zcrx_ctrl(ctx, arg, nr_args);
		break;
	default:
		ret = -EINVAL;
		break;
+21 −0
Original line number Diff line number Diff line
@@ -941,6 +941,27 @@ static const struct memory_provider_ops io_uring_pp_zc_ops = {
	.uninstall		= io_pp_uninstall,
};

int io_zcrx_ctrl(struct io_ring_ctx *ctx, void __user *arg, unsigned nr_args)
{
	struct zcrx_ctrl ctrl;
	struct io_zcrx_ifq *zcrx;

	if (nr_args)
		return -EINVAL;
	if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
		return -EFAULT;
	if (!mem_is_zero(&ctrl.__resv, sizeof(ctrl.__resv)))
		return -EFAULT;

	zcrx = xa_load(&ctx->zcrx_ctxs, ctrl.zcrx_id);
	if (!zcrx)
		return -ENXIO;
	if (ctrl.op >= __ZCRX_CTRL_LAST)
		return -EOPNOTSUPP;

	return -EINVAL;
}

static bool io_zcrx_queue_cqe(struct io_kiocb *req, struct net_iov *niov,
			      struct io_zcrx_ifq *ifq, int off, int len)
{
+6 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ struct io_zcrx_ifq {
};

#if defined(CONFIG_IO_URING_ZCRX)
int io_zcrx_ctrl(struct io_ring_ctx *ctx, void __user *arg, unsigned nr_arg);
int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
			 struct io_uring_zcrx_ifq_reg __user *arg);
void io_unregister_zcrx_ifqs(struct io_ring_ctx *ctx);
@@ -93,6 +94,11 @@ static inline struct io_mapped_region *io_zcrx_get_region(struct io_ring_ctx *ct
{
	return NULL;
}
static inline int io_zcrx_ctrl(struct io_ring_ctx *ctx,
				void __user *arg, unsigned nr_arg)
{
	return -EOPNOTSUPP;
}
#endif

int io_recvzc(struct io_kiocb *req, unsigned int issue_flags);