]> git.ipfire.org Git - thirdparty/qemu.git/commit
aio-posix: fix race between epoll upgrade and aio_set_fd_handler()
authorStefan Hajnoczi <stefanha@redhat.com>
Thu, 23 Mar 2023 14:48:59 +0000 (10:48 -0400)
committerMichael Tokarev <mjt@tls.msk.ru>
Mon, 10 Apr 2023 08:16:14 +0000 (11:16 +0300)
commit248aa3deb68a327a9450b536fab8e03a4ed89918
tree3142f9940eced81f42b187d37fa19f4aab7a9acd
parentd8592b05becfeea4da2c71b79ea3d9a7ef8cfe50
aio-posix: fix race between epoll upgrade and aio_set_fd_handler()

If another thread calls aio_set_fd_handler() while the IOThread event
loop is upgrading from ppoll(2) to epoll(7) then we might miss new
AioHandlers. The epollfd will not monitor the new AioHandler's fd,
resulting in hangs.

Take the AioHandler list lock while upgrading to epoll. This prevents
AioHandlers from changing while epoll is being set up. If we cannot lock
because we're in a nested event loop, then don't upgrade to epoll (it
will happen next time we're not in a nested call).

The downside to taking the lock is that the aio_set_fd_handler() thread
has to wait until the epoll upgrade is finished, which involves many
epoll_ctl(2) system calls. However, this scenario is rare and I couldn't
think of another solution that is still simple.

Reported-by: Qing Wang <qinwang@redhat.com>
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2090998
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Fam Zheng <fam@euphon.net>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20230323144859.1338495-1-stefanha@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
(cherry picked from commit e62da98527fa35fe5f532cded01a33edf9fbe7b2)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
util/fdmon-epoll.c