[Top][All Lists]
[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
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, (continued)
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Paolo Bonzini, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Avi Kivity, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Paolo Bonzini, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Avi Kivity, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Paolo Bonzini, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Jan Kiszka, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Paolo Bonzini, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Jan Kiszka, 2012/10/23
- Re: [Qemu-devel] [patch v4 05/16] memory: introduce ref, unref interface for MemoryRegionOps, Avi Kivity, 2012/10/23
[Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Liu Ping Fan, 2012/10/22
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info,
Jan Kiszka <=
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Peter Maydell, 2012/10/22
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, liu ping fan, 2012/10/23
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Paolo Bonzini, 2012/10/23
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Peter Maydell, 2012/10/23
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Jan Kiszka, 2012/10/23
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Paolo Bonzini, 2012/10/23
- Re: [Qemu-devel] [patch v4 08/16] QemuThread: make QemuThread as tls to store extra info, Peter Maydell, 2012/10/23
[Qemu-devel] [patch v4 12/16] e1000: apply fine lock on e1000, Liu Ping Fan, 2012/10/22