io_uring: stop using io_wq_work as an fd placeholder
authorJens Axboe <axboe@kernel.dk>
Mon, 11 Apr 2022 01:05:09 +0000 (19:05 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 11 Apr 2022 23:06:20 +0000 (17:06 -0600)
There are two reasons why this isn't the best idea:

- It's an odd area to grab a bit of storage space, hence it's an odd area
  to grab storage from.
- It puts the 3rd io_kiocb cacheline into the hot path, where normal hot
  path just needs the first two.

Use 'cflags' for joint fd/cflags storage. We only need fd until we
successfully issue, and we only need cflags once a request is done and is
completed.

Fixes: 6bf9c47a3989 ("io_uring: defer file assignment")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.h
fs/io_uring.c

index 04d374e..dbecd27 100644 (file)
@@ -155,7 +155,6 @@ struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack)
 struct io_wq_work {
        struct io_wq_work_node list;
        unsigned flags;
-       int fd;
 };
 
 static inline struct io_wq_work *wq_next_work(struct io_wq_work *work)
index 3a97535..38e62b1 100644 (file)
@@ -907,7 +907,11 @@ struct io_kiocb {
 
        u64                             user_data;
        u32                             result;
-       u32                             cflags;
+       /* fd initially, then cflags for completion */
+       union {
+               u32                     cflags;
+               int                     fd;
+       };
 
        struct io_ring_ctx              *ctx;
        struct task_struct              *task;
@@ -7090,9 +7094,9 @@ static bool io_assign_file(struct io_kiocb *req, unsigned int issue_flags)
                return true;
 
        if (req->flags & REQ_F_FIXED_FILE)
-               req->file = io_file_get_fixed(req, req->work.fd, issue_flags);
+               req->file = io_file_get_fixed(req, req->fd, issue_flags);
        else
-               req->file = io_file_get_normal(req, req->work.fd);
+               req->file = io_file_get_normal(req, req->fd);
        if (req->file)
                return true;
 
@@ -7630,7 +7634,7 @@ static int io_init_req(struct io_ring_ctx *ctx, struct io_kiocb *req,
        if (io_op_defs[opcode].needs_file) {
                struct io_submit_state *state = &ctx->submit_state;
 
-               req->work.fd = READ_ONCE(sqe->fd);
+               req->fd = READ_ONCE(sqe->fd);
 
                /*
                 * Plug now if we have more than 2 IO left after this, and the