[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v3 25/30] util/qemu-thread-*: add qemu_lock, loc
From: |
Pavel Dovgalyuk |
Subject: |
[Qemu-devel] [RFC PATCH v3 25/30] util/qemu-thread-*: add qemu_lock, locked and unlock trace events |
Date: |
Thu, 11 Jan 2018 11:27:16 +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 | 19 +++++++++++++++----
util/qemu-thread-posix.c | 21 ++++++++++++---------
util/trace-events | 7 ++++---
3 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index 9910f49..35375f0 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -22,9 +22,16 @@ 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 +46,11 @@ 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 959a570..b789cf3 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)"
- Re: [Qemu-devel] [RFC PATCH v3 15/30] cpus: push BQL lock to qemu_*_wait_io_event, (continued)
- [Qemu-devel] [RFC PATCH v3 16/30] cpus: only take BQL for sleeping threads, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 17/30] replay/replay.c: bump REPLAY_VERSION again, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 18/30] replay/replay-internal.c: track holding of replay_lock, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 19/30] replay: make locking visible outside replay code, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 20/30] replay: push replay_mutex_lock up the call tree, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 21/30] replay: don't destroy mutex at exit, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 22/30] replay: check return values of fwrite, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 23/30] replay: avoid recursive call of checkpoints, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 24/30] scripts/qemu-gdb: add simple tcg lock status helper, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 25/30] util/qemu-thread-*: add qemu_lock, locked and unlock trace events,
Pavel Dovgalyuk <=
- [Qemu-devel] [RFC PATCH v3 26/30] scripts/analyse-locks-simpletrace.py: script to analyse lock times, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 27/30] scripts/replay-dump.py: replay log dumper, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 28/30] scripts/qemu-gdb/timers.py: new helper to dump timer state, Pavel Dovgalyuk, 2018/01/11
- [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Pavel Dovgalyuk, 2018/01/11
- Re: [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Paolo Bonzini, 2018/01/11
- Re: [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Pavel Dovgalyuk, 2018/01/11
- Re: [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Paolo Bonzini, 2018/01/11
- Re: [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Pavel Dovgalyuk, 2018/01/12
- Re: [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Paolo Bonzini, 2018/01/12
- Re: [Qemu-devel] [RFC PATCH v3 29/30] replay: improve replay performance, Pavel Dovgalyuk, 2018/01/12