[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 23/26] util/qemu-thread-*: add qemu_lock, locked
From: |
Pavel Dovgalyuk |
Subject: |
[Qemu-devel] [RFC PATCH 23/26] util/qemu-thread-*: add qemu_lock, locked and unlock trace events |
Date: |
Tue, 31 Oct 2017 14:08:45 +0300 |
User-agent: |
StGit/0.17.1-dirty |
From: Alex Bennée <address@hidden>
Signed-off-by: Alex Bennée <address@hidden>
---
v1
- fix merge conflicts with existing tracing
- add trylock/cond_wait traces
---
include/qemu/thread.h | 14 ++++++++++----
util/qemu-thread-posix.c | 21 ++++++++++++---------
util/trace-events | 7 ++++---
3 files changed, 26 insertions(+), 16 deletions(-)
diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index 9910f49..c51a7f1 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -22,9 +22,13 @@ typedef struct QemuThread QemuThread;
void qemu_mutex_init(QemuMutex *mutex);
void qemu_mutex_destroy(QemuMutex *mutex);
-void qemu_mutex_lock(QemuMutex *mutex);
-int qemu_mutex_trylock(QemuMutex *mutex);
-void qemu_mutex_unlock(QemuMutex *mutex);
+int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int
line);
+void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line);
+void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int
line);
+
+#define qemu_mutex_lock(mutex) qemu_mutex_lock_impl(mutex, __FILE__, __LINE__)
+#define qemu_mutex_trylock(mutex) qemu_mutex_trylock_impl(mutex, __FILE__,
__LINE__)
+#define qemu_mutex_unlock(mutex) qemu_mutex_unlock_impl(mutex, __FILE__,
__LINE__)
/* Prototypes for other functions are in thread-posix.h/thread-win32.h. */
void qemu_rec_mutex_init(QemuRecMutex *mutex);
@@ -39,7 +43,9 @@ void qemu_cond_destroy(QemuCond *cond);
*/
void qemu_cond_signal(QemuCond *cond);
void qemu_cond_broadcast(QemuCond *cond);
-void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex);
+void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file,
const int line);
+
+#define qemu_cond_wait(cond, mutex) qemu_cond_wait_impl(cond, mutex, __FILE__,
__LINE__)
void qemu_sem_init(QemuSemaphore *sem, int init);
void qemu_sem_post(QemuSemaphore *sem);
diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
index 7306475..1a838a9 100644
--- a/util/qemu-thread-posix.c
+++ b/util/qemu-thread-posix.c
@@ -57,26 +57,28 @@ void qemu_mutex_destroy(QemuMutex *mutex)
error_exit(err, __func__);
}
-void qemu_mutex_lock(QemuMutex *mutex)
+void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line)
{
int err;
assert(mutex->initialized);
+ trace_qemu_mutex_lock(mutex, file, line);
+
err = pthread_mutex_lock(&mutex->lock);
if (err)
error_exit(err, __func__);
- trace_qemu_mutex_locked(mutex);
+ trace_qemu_mutex_locked(mutex, file, line);
}
-int qemu_mutex_trylock(QemuMutex *mutex)
+int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line)
{
int err;
assert(mutex->initialized);
err = pthread_mutex_trylock(&mutex->lock);
if (err == 0) {
- trace_qemu_mutex_locked(mutex);
+ trace_qemu_mutex_locked(mutex, file, line);
return 0;
}
if (err != EBUSY) {
@@ -85,15 +87,16 @@ int qemu_mutex_trylock(QemuMutex *mutex)
return -EBUSY;
}
-void qemu_mutex_unlock(QemuMutex *mutex)
+void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line)
{
int err;
assert(mutex->initialized);
- trace_qemu_mutex_unlocked(mutex);
err = pthread_mutex_unlock(&mutex->lock);
if (err)
error_exit(err, __func__);
+
+ trace_qemu_mutex_unlock(mutex, file, line);
}
void qemu_rec_mutex_init(QemuRecMutex *mutex)
@@ -152,14 +155,14 @@ void qemu_cond_broadcast(QemuCond *cond)
error_exit(err, __func__);
}
-void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
+void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file,
const int line)
{
int err;
assert(cond->initialized);
- trace_qemu_mutex_unlocked(mutex);
+ trace_qemu_mutex_unlock(mutex, file, line);
err = pthread_cond_wait(&cond->cond, &mutex->lock);
- trace_qemu_mutex_locked(mutex);
+ trace_qemu_mutex_locked(mutex, file, line);
if (err)
error_exit(err, __func__);
}
diff --git a/util/trace-events b/util/trace-events
index 025499f..515e625 100644
--- a/util/trace-events
+++ b/util/trace-events
@@ -56,6 +56,7 @@ lockcnt_futex_wait(const void *lockcnt, int val) "lockcnt %p
waiting on %d"
lockcnt_futex_wait_resume(const void *lockcnt, int new) "lockcnt %p after
wait: %d"
lockcnt_futex_wake(const void *lockcnt) "lockcnt %p waking up one waiter"
-# util/qemu-thread-posix.c
-qemu_mutex_locked(void *lock) "locked mutex %p"
-qemu_mutex_unlocked(void *lock) "unlocked mutex %p"
+# util/qemu-thread.c
+qemu_mutex_lock(void *mutex, const char *file, const int line) "waiting on
mutex %p (%s:%d)"
+qemu_mutex_locked(void *mutex, const char *file, const int line) "taken mutex
%p (%s:%d)"
+qemu_mutex_unlock(void *mutex, const char *file, const int line) "released
mutex %p (%s:%d)"
- [Qemu-devel] [RFC PATCH 13/26] cpus: only take BQL for sleeping threads, (continued)
- [Qemu-devel] [RFC PATCH 13/26] cpus: only take BQL for sleeping threads, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 14/26] replay/replay.c: bump REPLAY_VERSION again, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 15/26] replay/replay-internal.c: track holding of replay_lock, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 17/26] replay: push replay_mutex_lock up the call tree, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 16/26] replay: make locking visible outside replay code, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 18/26] cpu-exec: don't overwrite exception_index, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 20/26] replay: don't destroy mutex at exit, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 21/26] replay: check return values of fwrite, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 22/26] scripts/qemu-gdb: add simple tcg lock status helper, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 23/26] util/qemu-thread-*: add qemu_lock, locked and unlock trace events,
Pavel Dovgalyuk <=
- [Qemu-devel] [RFC PATCH 24/26] scripts/analyse-locks-simpletrace.py: script to analyse lock times, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 26/26] scripts/qemu-gdb/timers.py: new helper to dump timer state, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 25/26] scripts/replay-dump.py: replay log dumper, Pavel Dovgalyuk, 2017/10/31
- Re: [Qemu-devel] [RFC PATCH 00/26] replay additions, no-reply, 2017/10/31
- [Qemu-devel] [RFC PATCH 00/26] replay additions, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 01/26] block: implement bdrv_snapshot_goto for blkreplay, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 02/26] blkreplay: create temporary overlay for underlaying devices, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 03/26] replay: disable default snapshot for record/replay, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 04/26] replay: fix processing async events, Pavel Dovgalyuk, 2017/10/31
- [Qemu-devel] [RFC PATCH 05/26] replay: fixed replay_enable_events, Pavel Dovgalyuk, 2017/10/31