UPSTREAM: io_uring: fix waiters missing wake ups

There are reports of mariadb hangs, which is caused by a missing
barrier in the waking code resulting in waiters losing events.

The problem was introduced in a backport
3ab9326f93 ("io_uring: wake up optimisations"),
and the change restores the barrier present in the original commit
3ab9326f93 ("io_uring: wake up optimisations")

Reported by: Xan Charbonnet <xan@charbonnet.com>
Fixes: 3ab9326f93 ("io_uring: wake up optimisations")
Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1093243#99
Link: https://lore.kernel.org/io-uring/760086647776a5aebfa77cfff728837d476a4fd8.1737718881.git.asml.silence@gmail.com/
(cherry picked from commit 74a37ce697
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.128)
Reviewed-by: Li Zetao <lizetao1@huawei.com>
Change-Id: Ib21c4cb9a135fb58188dadfb7996afcca93bb5e1
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Akilesh Kailash <akailash@google.com>
This commit is contained in:
Pavel Begunkov
2023-01-09 14:46:10 +00:00
committed by Akilesh Kailash
parent 2055772ead
commit 1cf6be7092

View File

@@ -592,8 +592,10 @@ static inline void __io_cq_unlock_post_flush(struct io_ring_ctx *ctx)
io_commit_cqring(ctx);
spin_unlock(&ctx->completion_lock);
io_commit_cqring_flush(ctx);
if (!(ctx->flags & IORING_SETUP_DEFER_TASKRUN))
if (!(ctx->flags & IORING_SETUP_DEFER_TASKRUN)) {
smp_mb();
__io_cqring_wake(ctx);
}
}
void io_cq_unlock_post(struct io_ring_ctx *ctx)