In a recent discussion, Phil Dennis-Jordan pointed out a quirk in QemuEvent destruction due to futex-like abstraction, which prevented the usage of QemuEvent in new and existing code[1]. With some more thoughts after this discussion, I also found other problem and room of improvement in futex usage. Here is a stack of patches to resolve them.
Patch "futex: Check value after qemu_futex_wait()" ensures qemu_futex_wait() is used in loops as suggested in the man page. Patch "futex: Support Windows" implements futex functions for Windows. Patch "qemu-thread: Avoid futex abstraction for non-Linux" and "qemu-thread: Use futex for QemuEvent on Windows" enable destroying QemuEvent immediately after qemu_event_wait(). Patch "qemu-thread: Use futex for QemuEvent on Windows" and "qemu-thread: Use futex if available for QemuLockCnt" make the use of futex functions added for Windows. Patches "migration: Replace QemuSemaphore with QemuEvent", "migration/colo: Replace QemuSemaphore with QemuEvent", "migration/postcopy: Replace QemuSemaphore with QemuEvent", and "hw/display/apple-gfx: Replace QemuSemaphore with QemuEvent" replace some QemuSemaphores with QemuEvents, which can utilize futex. Some of them rely on that QemuEvent can be destroyed immediately after qemu_event_wait(). [1]: https://lore.kernel.org/r/caaibmn3hzedek8fryhha1ggwc+n8rbub2vvmrm7lct0mugm...@mail.gmail.com Signed-off-by: Akihiko Odaki <akihiko.od...@daynix.com> --- Changes in v3: - Fixed race between qemu_event_reset() and qemu_event_set(). - Prepared for spurious pthread_cond_wait() wakeups. - Added patch "futex: Replace __linux__ with CONFIG_LINUX". - Link to v2: https://lore.kernel.org/qemu-devel/20250510-event-v2-0-7953177ce...@daynix.com Changes in v2: - Rebased. - Added patch "hw/display/apple-gfx: Replace QemuSemaphore with QemuEvent". - Link to v1: https://lore.kernel.org/r/20241225-event-v1-0-a58c8d63e...@daynix.com --- Akihiko Odaki (10): futex: Check value after qemu_futex_wait() futex: Support Windows futex: Replace __linux__ with CONFIG_LINUX qemu-thread: Avoid futex abstraction for non-Linux qemu-thread: Use futex for QemuEvent on Windows qemu-thread: Use futex if available for QemuLockCnt migration: Replace QemuSemaphore with QemuEvent migration/colo: Replace QemuSemaphore with QemuEvent migration/postcopy: Replace QemuSemaphore with QemuEvent hw/display/apple-gfx: Replace QemuSemaphore with QemuEvent meson.build | 2 + include/qemu/futex.h | 44 +++++++++++- include/qemu/lockcnt.h | 2 +- include/qemu/thread-posix.h | 9 --- include/qemu/thread-win32.h | 6 -- include/qemu/thread.h | 11 ++- migration/migration.h | 16 ++--- migration/colo.c | 20 +++--- migration/migration.c | 29 ++++---- migration/postcopy-ram.c | 10 +-- migration/savevm.c | 2 +- tests/unit/test-aio-multithread.c | 6 +- util/event.c | 148 ++++++++++++++++++++++++++++++++++++++ util/lockcnt.c | 9 +-- util/qemu-thread-posix.c | 148 -------------------------------------- util/qemu-thread-win32.c | 129 --------------------------------- hw/display/apple-gfx.m | 10 +-- util/meson.build | 3 +- 18 files changed, 255 insertions(+), 349 deletions(-) --- base-commit: 4b1f5b73e060971c434e70694d571adfee553027 change-id: 20241031-event-785a2f0dda4a Best regards, -- Akihiko Odaki <akihiko.od...@daynix.com>