From: Pavel Begunkov Date: Wed, 9 Aug 2023 12:21:41 +0000 (+0100) Subject: io_uring: fix drain stalls by invalid SQE X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=cfdbaa3a291d6fd2cb4a1a70d74e63b4abc2f5ec;p=linux.git io_uring: fix drain stalls by invalid SQE cq_extra is protected by ->completion_lock, which io_get_sqe() misses. The bug is harmless as it doesn't happen in real life, requires invalid SQ index array and racing with submission, and only messes up the userspace, i.e. stall requests execution but will be cleaned up on ring destruction. Fixes: 15641e427070f ("io_uring: don't cache number of dropped SQEs") Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/66096d54651b1a60534bb2023f2947f09f50ef73.1691538547.git.asml.silence@gmail.com Signed-off-by: Jens Axboe --- diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 679bea7c41a62..249cab9c86d10 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -2374,7 +2374,9 @@ static bool io_get_sqe(struct io_ring_ctx *ctx, const struct io_uring_sqe **sqe) } /* drop invalid entries */ + spin_lock(&ctx->completion_lock); ctx->cq_extra--; + spin_unlock(&ctx->completion_lock); WRITE_ONCE(ctx->rings->sq_dropped, READ_ONCE(ctx->rings->sq_dropped) + 1); return false;