]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
io_uring/bpf_filter: move filter size and populate helper into struct
authorJens Axboe <axboe@kernel.dk>
Tue, 10 Feb 2026 16:29:59 +0000 (09:29 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 16 Feb 2026 22:56:25 +0000 (15:56 -0700)
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: Jens Axboe <axboe@kernel.dk>
io_uring/bpf_filter.c
io_uring/opdef.c
io_uring/opdef.h

index 3816883a45ed0a490b4f7a92a380b759995c5e60..8ac7d06de122f5861df95cccb5f18ce2513582c6 100644 (file)
@@ -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);
        }
 }
 
index df52d760240e475c2e9256b111892dfe9aa4e6d2..91a23baf415e89cb7fd8f9ae797f02e22d5bfc26 100644 (file)
@@ -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
index aa37846880ffd247258f85937d521fed5a9713f4..faf3955dce8b914924b77c3f617d70b822a4930d 100644 (file)
@@ -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 {