On 2012-10-22 11:23, Liu Ping Fan wrote: > If mmio dispatch out of big lock, some function's calling context (ie, > holding big lock or not) are different. We need to trace these info in > runtime, and use tls to store them. > By this method, we can avoid to require big lock recursive. > > Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com> > --- > cpus.c | 1 + > qemu-thread-posix.c | 7 +++++++ > qemu-thread-posix.h | 2 ++ > qemu-thread.h | 1 + > vl.c | 6 ++++++ > 5 files changed, 17 insertions(+), 0 deletions(-) > > diff --git a/cpus.c b/cpus.c > index e476a3c..4cd7f85 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -735,6 +735,7 @@ static void *qemu_kvm_cpu_thread_fn(void *arg) > CPUState *cpu = ENV_GET_CPU(env); > int r; > > + pthread_setspecific(qemu_thread_key, cpu->thread); > qemu_mutex_lock(&qemu_global_mutex); > qemu_thread_get_self(cpu->thread); > env->thread_id = qemu_get_thread_id(); > diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c > index 8fbabda..f448fcb 100644 > --- a/qemu-thread-posix.c > +++ b/qemu-thread-posix.c > @@ -19,6 +19,8 @@ > #include <string.h> > #include "qemu-thread.h" > > +pthread_key_t qemu_thread_key; > + > static void error_exit(int err, const char *msg) > { > fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err)); > @@ -151,6 +153,11 @@ void qemu_thread_get_self(QemuThread *thread) > thread->thread = pthread_self(); > } > > +void qemu_thread_key_create(void) > +{ > + pthread_key_create(&qemu_thread_key, NULL); > +} > + > bool qemu_thread_is_self(QemuThread *thread) > { > return pthread_equal(pthread_self(), thread->thread); > diff --git a/qemu-thread-posix.h b/qemu-thread-posix.h > index ee4618e..2607b1c 100644 > --- a/qemu-thread-posix.h > +++ b/qemu-thread-posix.h > @@ -14,4 +14,6 @@ struct QemuThread { > pthread_t thread; > }; > > +extern pthread_key_t qemu_thread_key; > + > #endif > diff --git a/qemu-thread.h b/qemu-thread.h > index 05fdaaf..4a6427d 100644 > --- a/qemu-thread.h > +++ b/qemu-thread.h > @@ -46,4 +46,5 @@ void qemu_thread_get_self(QemuThread *thread); > bool qemu_thread_is_self(QemuThread *thread); > void qemu_thread_exit(void *retval); > > +void qemu_thread_key_create(void); > #endif > diff --git a/vl.c b/vl.c > index 7c577fa..442479a 100644 > --- a/vl.c > +++ b/vl.c > @@ -149,6 +149,7 @@ int main(int argc, char **argv) > #include "qemu-options.h" > #include "qmp-commands.h" > #include "main-loop.h" > +#include "qemu-thread.h" > #ifdef CONFIG_VIRTFS > #include "fsdev/qemu-fsdev.h" > #endif > @@ -2342,6 +2343,7 @@ int qemu_init_main_loop(void) > return main_loop_init(); > } > > + > int main(int argc, char **argv, char **envp) > { > int i; > @@ -3483,6 +3485,10 @@ int main(int argc, char **argv, char **envp) > exit(1); > } > > + qemu_thread_key_create(); > + QemuThread *ioctx = g_malloc0(sizeof(QemuThread)); > + pthread_setspecific(qemu_thread_key, ioctx); > + > os_set_line_buffering(); > > if (init_timer_alarm() < 0) { >
Can't we enhance qemu-tls.h to work via pthread_setspecific in case __thread is not working and use that abstraction (DECLARE/DEFINE_TLS) directly? Also, the above breaks win32, doesn't it? Jan -- Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux