qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to


From: Jan Kiszka
Subject: Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info
Date: Mon, 22 Oct 2012 11:30:23 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666

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 <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]