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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Apr 2022 07:36:15 +0000 (09:36 +0200)
[ Upstream commit 82733d168cbd3fe9dab603f05894316b99008924 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/io-wq.h
fs/io_uring.c

index 04d374e65e546495b4c6370cabeb7982bb05c872..dbecd27656c7ccd79f1d738f40a1c9feebd147ad 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 d13f142793f2c305eb4de92f47bc625c43335553..d05394b0c1e6d53cb6e73d91bbca67435affc38e 100644 (file)
@@ -864,7 +864,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;
@@ -6708,9 +6712,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;
 
@@ -7243,7 +7247,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