io_uring: trigger eventfd for IOPOLL
Make sure io_iopoll_complete() tries to wake up eventfd, which currently is skipped together with io_cqring_ev_posted() for non-SQPOLL IOPOLL. Add an iopoll version of io_cqring_ev_posted(), duplicates a bit of code, but they actually use different sets of wait queues may be for better. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
3e2224c586
Коммит
80c18e4ac2
|
@ -1713,6 +1713,16 @@ static void io_cqring_ev_posted(struct io_ring_ctx *ctx)
|
||||||
eventfd_signal(ctx->cq_ev_fd, 1);
|
eventfd_signal(ctx->cq_ev_fd, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void io_cqring_ev_posted_iopoll(struct io_ring_ctx *ctx)
|
||||||
|
{
|
||||||
|
if (ctx->flags & IORING_SETUP_SQPOLL) {
|
||||||
|
if (waitqueue_active(&ctx->wait))
|
||||||
|
wake_up(&ctx->wait);
|
||||||
|
}
|
||||||
|
if (io_should_trigger_evfd(ctx))
|
||||||
|
eventfd_signal(ctx->cq_ev_fd, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns true if there are no backlogged entries after the flush */
|
/* Returns true if there are no backlogged entries after the flush */
|
||||||
static bool __io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force,
|
static bool __io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force,
|
||||||
struct task_struct *tsk,
|
struct task_struct *tsk,
|
||||||
|
@ -2428,8 +2438,7 @@ static void io_iopoll_complete(struct io_ring_ctx *ctx, unsigned int *nr_events,
|
||||||
}
|
}
|
||||||
|
|
||||||
io_commit_cqring(ctx);
|
io_commit_cqring(ctx);
|
||||||
if (ctx->flags & IORING_SETUP_SQPOLL)
|
io_cqring_ev_posted_iopoll(ctx);
|
||||||
io_cqring_ev_posted(ctx);
|
|
||||||
io_req_free_batch_finish(ctx, &rb);
|
io_req_free_batch_finish(ctx, &rb);
|
||||||
|
|
||||||
if (!list_empty(&again))
|
if (!list_empty(&again))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче