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 <mordan@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