Commit d21c3621 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring/bpf_filter: move filter size and populate helper into struct



Rather than open-code this logic in io_uring_populate_bpf_ctx() with
a switch, move it to the issue side definitions. Outside of making this
easier to extend in the future, it's also a prep patch for using the
pdu size for a given opcode filter elsewhere.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 22dbb098
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ static const struct io_bpf_filter dummy_filter;
static void io_uring_populate_bpf_ctx(struct io_uring_bpf_ctx *bctx,
				      struct io_kiocb *req)
{
	const struct io_issue_def *def = &io_issue_defs[req->opcode];

	bctx->opcode = req->opcode;
	bctx->sqe_flags = (__force int) req->flags & SQE_VALID_FLAGS;
	bctx->user_data = req->cqe.user_data;
@@ -34,19 +36,12 @@ static void io_uring_populate_bpf_ctx(struct io_uring_bpf_ctx *bctx,
		sizeof(*bctx) - offsetof(struct io_uring_bpf_ctx, pdu_size));

	/*
	 * Opcodes can provide a handler fo populating more data into bctx,
	 * Opcodes can provide a handler for populating more data into bctx,
	 * for filters to use.
	 */
	switch (req->opcode) {
	case IORING_OP_SOCKET:
		bctx->pdu_size = sizeof(bctx->socket);
		io_socket_bpf_populate(bctx, req);
		break;
	case IORING_OP_OPENAT:
	case IORING_OP_OPENAT2:
		bctx->pdu_size = sizeof(bctx->open);
		io_openat_bpf_populate(bctx, req);
		break;
	if (def->filter_pdu_size) {
		bctx->pdu_size = def->filter_pdu_size;
		def->filter_populate(bctx, req);
	}
}

+6 −0
Original line number Diff line number Diff line
@@ -221,8 +221,10 @@ const struct io_issue_def io_issue_defs[] = {
		.issue			= io_fallocate,
	},
	[IORING_OP_OPENAT] = {
		.filter_pdu_size	= sizeof_field(struct io_uring_bpf_ctx, open),
		.prep			= io_openat_prep,
		.issue			= io_openat,
		.filter_populate	= io_openat_bpf_populate,
	},
	[IORING_OP_CLOSE] = {
		.prep			= io_close_prep,
@@ -309,8 +311,10 @@ const struct io_issue_def io_issue_defs[] = {
#endif
	},
	[IORING_OP_OPENAT2] = {
		.filter_pdu_size	= sizeof_field(struct io_uring_bpf_ctx, open),
		.prep			= io_openat2_prep,
		.issue			= io_openat2,
		.filter_populate	= io_openat_bpf_populate,
	},
	[IORING_OP_EPOLL_CTL] = {
		.unbound_nonreg_file	= 1,
@@ -406,8 +410,10 @@ const struct io_issue_def io_issue_defs[] = {
	[IORING_OP_SOCKET] = {
		.audit_skip		= 1,
#if defined(CONFIG_NET)
		.filter_pdu_size	= sizeof_field(struct io_uring_bpf_ctx, socket),
		.prep			= io_socket_prep,
		.issue			= io_socket,
		.filter_populate	= io_socket_bpf_populate,
#else
		.prep			= io_eopnotsupp_prep,
#endif
+6 −0
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@
#ifndef IOU_OP_DEF_H
#define IOU_OP_DEF_H

struct io_uring_bpf_ctx;

struct io_issue_def {
	/* needs req->file assigned */
	unsigned		needs_file : 1;
@@ -33,8 +35,12 @@ struct io_issue_def {
	/* size of async data needed, if any */
	unsigned short		async_size;

	/* bpf filter pdu size, if any */
	unsigned short		filter_pdu_size;

	int (*issue)(struct io_kiocb *, unsigned int);
	int (*prep)(struct io_kiocb *, const struct io_uring_sqe *);
	void (*filter_populate)(struct io_uring_bpf_ctx *, struct io_kiocb *);
};

struct io_cold_def {