diff options
author | Jens Axboe <axboe@kernel.dk> | 2023-09-11 21:46:07 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2023-09-21 20:00:46 +0200 |
commit | d2d778fbf9964e4e5b8d7420eba8ec5ce938e794 (patch) | |
tree | 847bb33ec1926213798971656eaf414f83566a54 /io_uring/rw.c | |
parent | io_uring/rw: split io_read() into a helper (diff) | |
download | linux-d2d778fbf9964e4e5b8d7420eba8ec5ce938e794.tar.xz linux-d2d778fbf9964e4e5b8d7420eba8ec5ce938e794.zip |
io_uring/rw: mark readv/writev as vectored in the opcode definition
This is cleaner than gating on the opcode type, particularly as more
read/write type opcodes may be added.
Then we can use that for the data import, and for __io_read() on
whether or not we need to copy state.
Reviewed-by: Gabriel Krisman Bertazi <krisman@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/rw.c')
-rw-r--r-- | io_uring/rw.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/io_uring/rw.c b/io_uring/rw.c index 5c58962d73da..83ae911c2868 100644 --- a/io_uring/rw.c +++ b/io_uring/rw.c @@ -388,8 +388,7 @@ static struct iovec *__io_import_iovec(int ddir, struct io_kiocb *req, buf = u64_to_user_ptr(rw->addr); sqe_len = rw->len; - if (opcode == IORING_OP_READ || opcode == IORING_OP_WRITE || - (req->flags & REQ_F_BUFFER_SELECT)) { + if (!io_issue_defs[opcode].vectored || req->flags & REQ_F_BUFFER_SELECT) { if (io_do_buffer_select(req)) { buf = io_buffer_select(req, &sqe_len, issue_flags); if (!buf) @@ -776,8 +775,11 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags) if (ret == -EAGAIN || (req->flags & REQ_F_REISSUE)) { req->flags &= ~REQ_F_REISSUE; - /* if we can poll, just do that */ - if (req->opcode == IORING_OP_READ && file_can_poll(req->file)) + /* + * If we can poll, just do that. For a vectored read, we'll + * need to copy state first. + */ + if (file_can_poll(req->file) && !io_issue_defs[req->opcode].vectored) return -EAGAIN; /* IOPOLL retry should happen for io-wq threads */ if (!force_nonblock && !(req->ctx->flags & IORING_SETUP_IOPOLL)) |