[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v1 11/18] thread: add tsan annotations to QemuSpin
From: |
Alex Bennée |
Subject: |
[PATCH v1 11/18] thread: add tsan annotations to QemuSpin |
Date: |
Fri, 12 Jun 2020 20:02:30 +0100 |
From: "Emilio G. Cota" <cota@braap.org>
Signed-off-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200609200738.445-9-robert.foley@linaro.org>
---
include/qemu/thread.h | 39 ++++++++++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index e50a0738897..43fc094b963 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -206,6 +206,10 @@ void qemu_thread_atexit_add(struct Notifier *notifier);
*/
void qemu_thread_atexit_remove(struct Notifier *notifier);
+#ifdef CONFIG_TSAN
+#include <sanitizer/tsan_interface.h>
+#endif
+
struct QemuSpin {
int value;
};
@@ -213,23 +217,46 @@ struct QemuSpin {
static inline void qemu_spin_init(QemuSpin *spin)
{
__sync_lock_release(&spin->value);
+#ifdef CONFIG_TSAN
+ __tsan_mutex_create(spin, __tsan_mutex_not_static);
+#endif
}
-static inline void qemu_spin_destroy(QemuSpin *spin)
-{ }
+/* const parameter because the only purpose here is the TSAN annotation */
+static inline void qemu_spin_destroy(const QemuSpin *spin)
+{
+#ifdef CONFIG_TSAN
+ __tsan_mutex_destroy((void *)spin, __tsan_mutex_not_static);
+#endif
+}
static inline void qemu_spin_lock(QemuSpin *spin)
{
+#ifdef CONFIG_TSAN
+ __tsan_mutex_pre_lock(spin, 0);
+#endif
while (unlikely(__sync_lock_test_and_set(&spin->value, true))) {
while (atomic_read(&spin->value)) {
cpu_relax();
}
}
+#ifdef CONFIG_TSAN
+ __tsan_mutex_post_lock(spin, 0, 0);
+#endif
}
static inline bool qemu_spin_trylock(QemuSpin *spin)
{
- return __sync_lock_test_and_set(&spin->value, true);
+#ifdef CONFIG_TSAN
+ __tsan_mutex_pre_lock(spin, __tsan_mutex_try_lock);
+#endif
+ bool busy = __sync_lock_test_and_set(&spin->value, true);
+#ifdef CONFIG_TSAN
+ unsigned flags = __tsan_mutex_try_lock;
+ flags |= busy ? __tsan_mutex_try_lock_failed : 0;
+ __tsan_mutex_post_lock(spin, flags, 0);
+#endif
+ return busy;
}
static inline bool qemu_spin_locked(QemuSpin *spin)
@@ -239,7 +266,13 @@ static inline bool qemu_spin_locked(QemuSpin *spin)
static inline void qemu_spin_unlock(QemuSpin *spin)
{
+#ifdef CONFIG_TSAN
+ __tsan_mutex_pre_unlock(spin, 0);
+#endif
__sync_lock_release(&spin->value);
+#ifdef CONFIG_TSAN
+ __tsan_mutex_post_unlock(spin, 0);
+#endif
}
struct QemuLockCnt {
--
2.20.1
- [PATCH v1 02/18] Makefile: dtc: update, build the libfdt target, (continued)
- [PATCH v1 02/18] Makefile: dtc: update, build the libfdt target, Alex Bennée, 2020/06/12
- [PATCH v1 03/18] Makefile: remove old compatibility gunks, Alex Bennée, 2020/06/12
- [PATCH v1 04/18] configure: add --enable-tsan flag + fiber annotations for coroutine-ucontext, Alex Bennée, 2020/06/12
- [PATCH v1 05/18] cpu: convert queued work to a QSIMPLEQ, Alex Bennée, 2020/06/12
- [PATCH v1 12/18] tests/docker: Added docker build support for TSan., Alex Bennée, 2020/06/12
- [PATCH v1 06/18] thread: add qemu_spin_destroy, Alex Bennée, 2020/06/12
- [PATCH v1 08/18] qht: call qemu_spin_destroy for head buckets, Alex Bennée, 2020/06/12
- [PATCH v1 07/18] cputlb: destroy CPUTLB with tlb_destroy, Alex Bennée, 2020/06/12
- [PATCH v1 09/18] tcg: call qemu_spin_destroy for tb->jmp_lock, Alex Bennée, 2020/06/12
- [PATCH v1 10/18] translate-all: call qemu_spin_destroy for PageDesc, Alex Bennée, 2020/06/12
- [PATCH v1 11/18] thread: add tsan annotations to QemuSpin,
Alex Bennée <=
- [PATCH v1 14/18] util: Added tsan annotate for thread name., Alex Bennée, 2020/06/12
- [PATCH v1 17/18] Revert ".shippable: temporaily disable some cross builds", Alex Bennée, 2020/06/12
- [PATCH v1 18/18] cirrus.yml: serialise make check, Alex Bennée, 2020/06/12
- [PATCH v1 13/18] include/qemu: Added tsan.h for annotations., Alex Bennée, 2020/06/12
- [PATCH v1 15/18] docs: Added details on TSan to testing.rst, Alex Bennée, 2020/06/12
- [PATCH v1 16/18] tests: Disable select tests under TSan, which hit TSan issue., Alex Bennée, 2020/06/12
- Re: [PATCH v1 00/18] testing/next (tsan, dtc warnings, cross-builds), no-reply, 2020/06/12