diff options
author | Jackie Liu <liuyun01@kylinos.cn> | 2019-09-09 15:50:39 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-09-10 01:14:47 +0300 |
commit | 8776f3fa15a5cd213c4dfab7ddaf557983374ea6 (patch) | |
tree | a3844c46ef13328be32e5894046b45fe04a6c2b5 | |
parent | ac90f249e15cd2a850daa9e36e15f81ce1ff6550 (diff) | |
download | linux-8776f3fa15a5cd213c4dfab7ddaf557983374ea6.tar.xz |
io_uring: fix wrong sequence setting logic
Sqo_thread will get sqring in batches, which will cause
ctx->cached_sq_head to be added in batches. if one of these
sqes is set with the DRAIN flag, then he will never get a
chance to process, and finally sqo_thread will not exit.
Fixes: de0617e4671 ("io_uring: add support for marking commands as draining")
Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | fs/io_uring.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index be24596e90d7..cf6d807fa414 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -264,6 +264,7 @@ struct io_ring_ctx { struct sqe_submit { const struct io_uring_sqe *sqe; unsigned short index; + u32 sequence; bool has_user; bool needs_lock; bool needs_fixed_file; @@ -2016,7 +2017,7 @@ static int io_req_set_file(struct io_ring_ctx *ctx, const struct sqe_submit *s, if (flags & IOSQE_IO_DRAIN) { req->flags |= REQ_F_IO_DRAIN; - req->sequence = ctx->cached_sq_head - 1; + req->sequence = s->sequence; } if (!io_op_needs_file(s->sqe)) @@ -2224,6 +2225,7 @@ static bool io_get_sqring(struct io_ring_ctx *ctx, struct sqe_submit *s) if (head < ctx->sq_entries) { s->index = head; s->sqe = &ctx->sq_sqes[head]; + s->sequence = ctx->cached_sq_head; ctx->cached_sq_head++; return true; } |