This patch adds missing annotations for qemu_event_set, qemu_event_reset, and qemu_event_wait to prevent TSAN from reporting false alarms caused by the use of barriers and futex_wait.
Fixes: c7c4d063f5 ("qemu-thread: add QemuEvent") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2904 Signed-off-by: Vitalii Mordan <mor...@ispras.ru> --- util/qemu-thread-posix.c | 4 ++++ util/qemu-thread-win32.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index b2e26e2120..2f6b4834e9 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -403,6 +403,7 @@ void qemu_event_set(QemuEvent *ev) qemu_futex_wake(ev, INT_MAX); } } + QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(ev); } void qemu_event_reset(QemuEvent *ev) @@ -420,6 +421,7 @@ void qemu_event_reset(QemuEvent *ev) * Pairs with the first memory barrier in qemu_event_set(). */ smp_mb__after_rmw(); + QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(ev); } void qemu_event_wait(QemuEvent *ev) @@ -452,6 +454,7 @@ void qemu_event_wait(QemuEvent *ev) * like the load above. */ if (qatomic_cmpxchg(&ev->value, EV_FREE, EV_BUSY) == EV_SET) { + QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(ev); return; } } @@ -463,6 +466,7 @@ void qemu_event_wait(QemuEvent *ev) */ qemu_futex_wait(ev, EV_BUSY); } + QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(ev); } static __thread NotifierList thread_exit; diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c index a7fe3cc345..b08aed9b6f 100644 --- a/util/qemu-thread-win32.c +++ b/util/qemu-thread-win32.c @@ -290,6 +290,7 @@ void qemu_event_set(QemuEvent *ev) SetEvent(ev->event); } } + QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(ev); } void qemu_event_reset(QemuEvent *ev) @@ -307,6 +308,7 @@ void qemu_event_reset(QemuEvent *ev) * Pairs with the first memory barrier in qemu_event_set(). */ smp_mb__after_rmw(); + QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(ev); } void qemu_event_wait(QemuEvent *ev) @@ -348,6 +350,7 @@ void qemu_event_wait(QemuEvent *ev) * set or busy. */ if (qatomic_cmpxchg(&ev->value, EV_FREE, EV_BUSY) == EV_SET) { + QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(ev); return; } } @@ -358,6 +361,7 @@ void qemu_event_wait(QemuEvent *ev) */ WaitForSingleObject(ev->event, INFINITE); } + QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(ev); } struct QemuThreadData { -- 2.34.1