From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:45666) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TQELA-0004Id-Vd for qemu-devel@nongnu.org; Mon, 22 Oct 2012 05:30:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TQEL8-0008WI-US for qemu-devel@nongnu.org; Mon, 22 Oct 2012 05:30:32 -0400 Received: from thoth.sbs.de ([192.35.17.2]:25319) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TQEL8-0008Vh-LA for qemu-devel@nongnu.org; Mon, 22 Oct 2012 05:30:30 -0400 Message-ID: <5085122F.1040106@siemens.com> Date: Mon, 22 Oct 2012 11:30:23 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <1350897839-29593-1-git-send-email-pingfank@linux.vnet.ibm.com> <1350897839-29593-9-git-send-email-pingfank@linux.vnet.ibm.com> In-Reply-To: <1350897839-29593-9-git-send-email-pingfank@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Liu Ping Fan Cc: Stefan Hajnoczi , Marcelo Tosatti , "qemu-devel@nongnu.org" , Avi Kivity , Anthony Liguori , Paolo Bonzini 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 > --- > 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 > #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