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


Reply via email to