diff options
author | Jens Axboe <axboe@kernel.dk> | 2022-11-20 10:18:45 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-11-22 06:08:31 -0700 |
commit | 4464853277d0ccdb9914608dd1332f0fa2f9846f (patch) | |
tree | 3c1df058d34a9852a6623d6db533eeb5c0525dde /io_uring/poll.c | |
parent | 03e02acda8e267a8183e1e0ed289ff1ef9cd7ed8 (diff) |
io_uring: pass in EPOLL_URING_WAKE for eventfd signaling and wakeups
Pass in EPOLL_URING_WAKE when signaling eventfd or doing poll related
wakups, so that we can check for a circular event dependency between
eventfd and epoll. If this flag is set when our wakeup handlers are
called, then we know we have a dependency that needs to terminate
multishot requests.
eventfd and epoll are the only such possible dependencies.
Cc: stable@vger.kernel.org # 6.0
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/poll.c')
-rw-r--r-- | io_uring/poll.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/io_uring/poll.c b/io_uring/poll.c index 8fb8e781c02d..22c9b2e0944a 100644 --- a/io_uring/poll.c +++ b/io_uring/poll.c @@ -389,6 +389,14 @@ static int io_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, return 0; if (io_poll_get_ownership(req)) { + /* + * If we trigger a multishot poll off our own wakeup path, + * disable multishot as there is a circular dependency between + * CQ posting and triggering the event. + */ + if (mask & EPOLL_URING_WAKE) + poll->events |= EPOLLONESHOT; + /* optional, saves extra locking for removal in tw handler */ if (mask && poll->events & EPOLLONESHOT) { list_del_init(&poll->wait.entry); |