mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-31 03:14:24 +00:00
io_uring: fix missing mb() before waitqueue_active
In case of !SQPOLL, io_cqring_ev_posted_iopoll() doesn't provide a
memory barrier required by waitqueue_active(&ctx->poll_wait). There is
a wq_has_sleeper(), which does smb_mb() inside, but it's called only for
SQPOLL.
Fixes: 5fd4617840
("io_uring: be smarter about waking multiple CQ ring waiters")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/2982e53bcea2274006ed435ee2a77197107d8a29.1631130542.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
713b9825a4
commit
c57a91fb1c
1 changed files with 4 additions and 1 deletions
|
@ -1619,8 +1619,11 @@ static void io_cqring_ev_posted(struct io_ring_ctx *ctx)
|
||||||
|
|
||||||
static void io_cqring_ev_posted_iopoll(struct io_ring_ctx *ctx)
|
static void io_cqring_ev_posted_iopoll(struct io_ring_ctx *ctx)
|
||||||
{
|
{
|
||||||
|
/* see waitqueue_active() comment */
|
||||||
|
smp_mb();
|
||||||
|
|
||||||
if (ctx->flags & IORING_SETUP_SQPOLL) {
|
if (ctx->flags & IORING_SETUP_SQPOLL) {
|
||||||
if (wq_has_sleeper(&ctx->cq_wait))
|
if (waitqueue_active(&ctx->cq_wait))
|
||||||
wake_up_all(&ctx->cq_wait);
|
wake_up_all(&ctx->cq_wait);
|
||||||
}
|
}
|
||||||
if (io_should_trigger_evfd(ctx))
|
if (io_should_trigger_evfd(ctx))
|
||||||
|
|
Loading…
Add table
Reference in a new issue