aboutsummaryrefslogtreecommitdiff
path: root/include/sysemu/block-backend-io.h
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2023-03-23 10:48:59 -0400
committerKevin Wolf <kwolf@redhat.com>2023-03-27 15:12:17 +0200
commite62da98527fa35fe5f532cded01a33edf9fbe7b2 (patch)
treee7f32a15285972786c786d8f878cc352efbb7bc9 /include/sysemu/block-backend-io.h
parent2957dc40a270cd41a3932f96f0f63ac9c1e3a9be (diff)
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>
Diffstat (limited to 'include/sysemu/block-backend-io.h')
0 files changed, 0 insertions, 0 deletions