forked from Minki/linux
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>
This commit is contained in:
parent
b7e298d265
commit
179ae0d15e
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user