diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2021-02-28 22:35:20 +0000 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-04-11 17:41:58 -0600 |
commit | 179ae0d15e8b3a2d9affe680281009f1f10c4a9d (patch) | |
tree | 5c8dd8ad19ef52a59070d691383797f5a4952da8 /fs/io_uring.c | |
parent | b7e298d265f20eafc3615be271a3e5d90e4dc3dd (diff) | |
download | lwn-179ae0d15e8b3a2d9affe680281009f1f10c4a9d.tar.gz lwn-179ae0d15e8b3a2d9affe680281009f1f10c4a9d.zip |
io_uring: simplify io_resubmit_prep()
If not for async_data NULL check, io_resubmit_prep() is already an rw
specific version of io_req_prep_async(), but slower because 1) it always
goes through io_import_iovec() even if following io_setup_async_rw() the
result 2) instead of initialising iovec/iter in-place it does it
on-stack and then copies with io_setup_async_rw().
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r-- | fs/io_uring.c | 37 |
1 files changed, 3 insertions, 34 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index f0629065e16d..3e102acb311a 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1032,14 +1032,10 @@ static struct file *io_file_get(struct io_submit_state *state, static void __io_queue_sqe(struct io_kiocb *req); static void io_rsrc_put_work(struct work_struct *work); -static int io_import_iovec(int rw, struct io_kiocb *req, struct iovec **iovec, - struct iov_iter *iter, bool needs_lock); -static int io_setup_async_rw(struct io_kiocb *req, const struct iovec *iovec, - const struct iovec *fast_iov, - struct iov_iter *iter, bool force); static void io_req_task_queue(struct io_kiocb *req); static void io_submit_flush_completions(struct io_comp_state *cs, struct io_ring_ctx *ctx); +static int io_req_prep_async(struct io_kiocb *req); static struct kmem_cache *req_cachep; @@ -2429,35 +2425,8 @@ static void kiocb_end_write(struct io_kiocb *req) #ifdef CONFIG_BLOCK static bool io_resubmit_prep(struct io_kiocb *req) { - struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; - int rw, ret; - struct iov_iter iter; - - /* already prepared */ - if (req->async_data) - return true; - - switch (req->opcode) { - case IORING_OP_READV: - case IORING_OP_READ_FIXED: - case IORING_OP_READ: - rw = READ; - break; - case IORING_OP_WRITEV: - case IORING_OP_WRITE_FIXED: - case IORING_OP_WRITE: - rw = WRITE; - break; - default: - printk_once(KERN_WARNING "io_uring: bad opcode in resubmit %d\n", - req->opcode); - return false; - } - - ret = io_import_iovec(rw, req, &iovec, &iter, false); - if (ret < 0) - return false; - return !io_setup_async_rw(req, iovec, inline_vecs, &iter, false); + /* either already prepared or successfully done */ + return req->async_data || !io_req_prep_async(req); } static bool io_rw_should_reissue(struct io_kiocb *req) |