From: Jackie Liu Date: Mon, 9 Sep 2019 12:50:39 +0000 (+0800) Subject: io_uring: fix wrong sequence setting logic X-Git-Tag: v5.15~5403^2~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8776f3fa15a5cd213c4dfab7ddaf557983374ea6;p=platform%2Fkernel%2Flinux-starfive.git 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 Signed-off-by: Jens Axboe --- diff --git a/fs/io_uring.c b/fs/io_uring.c index be24596..cf6d807 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; }