* [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
@ 2011-10-03 16:33 Dr. David Alan Gilbert
2011-10-03 17:51 ` Jan Kiszka
0 siblings, 1 reply; 20+ messages in thread
From: Dr. David Alan Gilbert @ 2011-10-03 16:33 UTC (permalink / raw)
To: qemu-devel; +Cc: peter.maydell, agraf, patches
Make cpu_single_env thread local (Linux only for now)
* Fixes some user space threading issues (esp those triggered
by bug 823902)
Against rev d11cf8cc..., tested on ARM user mode, and ARM Vexpress
system mode (with Blue Swirl's fix from yesterday) - only
tested on Linux host. Lets me run ARM userspace firefox.
Signed-off-by: Dr. David Alan Gilbert <david.gilbert@linaro.org>
diff --git a/cpu-all.h b/cpu-all.h
index 42a5fa0..d895ee6 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -334,7 +334,13 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
GCC_FMT_ATTR(2, 3);
extern CPUState *first_cpu;
+
+#ifdef __linux__
+/* DAG: Only tested thread local on Linux, feel free to add others */
+extern __thread CPUState *cpu_single_env;
+#else
extern CPUState *cpu_single_env;
+#endif
/* Flags for use in ENV->INTERRUPT_PENDING.
diff --git a/exec.c b/exec.c
index d0cbf15..b82d8e4 100644
--- a/exec.c
+++ b/exec.c
@@ -120,7 +120,12 @@ static MemoryRegion *system_io;
CPUState *first_cpu;
/* current CPU in the current thread. It is only valid inside
cpu_exec() */
+#ifdef __linux__
+/* DAG: Only tested thread local on Linux, feel free to add others */
+__thread CPUState *cpu_single_env;
+#else
CPUState *cpu_single_env;
+#endif
/* 0 = Do not count executed instructions.
1 = Precise instruction counting.
2 = Adaptive rate instruction counting. */
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-03 16:33 [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now) Dr. David Alan Gilbert
@ 2011-10-03 17:51 ` Jan Kiszka
2011-10-04 15:10 ` Lluís Vilanova
0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2011-10-03 17:51 UTC (permalink / raw)
To: Dr. David Alan Gilbert; +Cc: peter.maydell, patches, qemu-devel, agraf
[-- Attachment #1: Type: text/plain, Size: 1421 bytes --]
On 2011-10-03 18:33, Dr. David Alan Gilbert wrote:
> Make cpu_single_env thread local (Linux only for now)
> * Fixes some user space threading issues (esp those triggered
> by bug 823902)
>
> Against rev d11cf8cc..., tested on ARM user mode, and ARM Vexpress
> system mode (with Blue Swirl's fix from yesterday) - only
> tested on Linux host. Lets me run ARM userspace firefox.
>
> Signed-off-by: Dr. David Alan Gilbert <david.gilbert@linaro.org>
>
> diff --git a/cpu-all.h b/cpu-all.h
> index 42a5fa0..d895ee6 100644
> --- a/cpu-all.h
> +++ b/cpu-all.h
> @@ -334,7 +334,13 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
> void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
> GCC_FMT_ATTR(2, 3);
> extern CPUState *first_cpu;
> +
> +#ifdef __linux__
> +/* DAG: Only tested thread local on Linux, feel free to add others */
> +extern __thread CPUState *cpu_single_env;
> +#else
> extern CPUState *cpu_single_env;
> +#endif
We need this for all platforms in order to skip qemu_global_mutex while
manipulating some CPUState. And leaving some platforms with non-TLS will
eventually break them when code is added that assumes TLS.
However, it's not unlikely that some weird platforms / ancient
toolchains still have problems with __thread - even on Linux. We may
want to play safe and use pthread_key on POSIX.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-03 17:51 ` Jan Kiszka
@ 2011-10-04 15:10 ` Lluís Vilanova
2011-10-04 17:26 ` Jan Kiszka
0 siblings, 1 reply; 20+ messages in thread
From: Lluís Vilanova @ 2011-10-04 15:10 UTC (permalink / raw)
To: Jan Kiszka
Cc: peter.maydell, agraf, Dr. David Alan Gilbert, qemu-devel, patches
Jan Kiszka writes:
> On 2011-10-03 18:33, Dr. David Alan Gilbert wrote:
>> Make cpu_single_env thread local (Linux only for now)
>> * Fixes some user space threading issues (esp those triggered
>> by bug 823902)
>>
>> Against rev d11cf8cc..., tested on ARM user mode, and ARM Vexpress
>> system mode (with Blue Swirl's fix from yesterday) - only
>> tested on Linux host. Lets me run ARM userspace firefox.
>>
>> Signed-off-by: Dr. David Alan Gilbert <david.gilbert@linaro.org>
>>
>> diff --git a/cpu-all.h b/cpu-all.h
>> index 42a5fa0..d895ee6 100644
>> --- a/cpu-all.h
>> +++ b/cpu-all.h
>> @@ -334,7 +334,13 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
>> void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
>> GCC_FMT_ATTR(2, 3);
>> extern CPUState *first_cpu;
>> +
>> +#ifdef __linux__
>> +/* DAG: Only tested thread local on Linux, feel free to add others */
>> +extern __thread CPUState *cpu_single_env;
>> +#else
>> extern CPUState *cpu_single_env;
>> +#endif
> We need this for all platforms in order to skip qemu_global_mutex while
> manipulating some CPUState. And leaving some platforms with non-TLS will
> eventually break them when code is added that assumes TLS.
> However, it's not unlikely that some weird platforms / ancient
> toolchains still have problems with __thread - even on Linux. We may
> want to play safe and use pthread_key on POSIX.
Why not make this kind of annotations available in qemu-commmon.h; or even
better somewhere less... "generic".
#if defined(CONFIG_SUPPORTS_THREAD_KEYWORD)
// use __thread
#define QEMU_DECL_TLS(type, name) \
extern __thread type name;
#define QEMU_DEF_TLS(type, name) \
__thread type name;
#define QEMU_SET_TLS(name, value) \
do { name = value; } while (0)
#define QEMU_GET_TLS(name) \
name
#elif defined(CONFIG_SUPPORTS_PTHREAD_KEY)
// use pthread_key_t
#define QEMU_DECL_TLS(type, name) \
extern type _type_##name; \
extern pthread_key_t name;
#define QEMU_DEF_TLS(type, name) \
pthread_key_t name; \
void _init_##name (void) __attribute__((constructor)); \
void _init_##name (void) { pthread_key_create(&name, NULL); }
#define QEMU_SET_TLS(name, value) \
do { pthread_setspecific(name, (void*)value); } while (0)
#define QEMU_GET_TLS(name) \
((typeof(_type_##name))pthread_getspecific(name))
#else
#error Go home
#endif
Lluis
--
"And it's much the same thing with knowledge, for whenever you learn
something new, the whole world becomes that much richer."
-- The Princess of Pure Reason, as told by Norton Juster in The Phantom
Tollbooth
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-04 15:10 ` Lluís Vilanova
@ 2011-10-04 17:26 ` Jan Kiszka
2011-10-05 7:08 ` Paolo Bonzini
0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2011-10-04 17:26 UTC (permalink / raw)
To: Dr. David Alan Gilbert, peter.maydell, patches, qemu-devel, agraf
[-- Attachment #1: Type: text/plain, Size: 2921 bytes --]
On 2011-10-04 17:10, Lluís Vilanova wrote:
> Jan Kiszka writes:
>
>> On 2011-10-03 18:33, Dr. David Alan Gilbert wrote:
>>> Make cpu_single_env thread local (Linux only for now)
>>> * Fixes some user space threading issues (esp those triggered
>>> by bug 823902)
>>>
>>> Against rev d11cf8cc..., tested on ARM user mode, and ARM Vexpress
>>> system mode (with Blue Swirl's fix from yesterday) - only
>>> tested on Linux host. Lets me run ARM userspace firefox.
>>>
>>> Signed-off-by: Dr. David Alan Gilbert <david.gilbert@linaro.org>
>>>
>>> diff --git a/cpu-all.h b/cpu-all.h
>>> index 42a5fa0..d895ee6 100644
>>> --- a/cpu-all.h
>>> +++ b/cpu-all.h
>>> @@ -334,7 +334,13 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
>>> void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
>>> GCC_FMT_ATTR(2, 3);
>>> extern CPUState *first_cpu;
>>> +
>>> +#ifdef __linux__
>>> +/* DAG: Only tested thread local on Linux, feel free to add others */
>>> +extern __thread CPUState *cpu_single_env;
>>> +#else
>>> extern CPUState *cpu_single_env;
>>> +#endif
>
>> We need this for all platforms in order to skip qemu_global_mutex while
>> manipulating some CPUState. And leaving some platforms with non-TLS will
>> eventually break them when code is added that assumes TLS.
>
>> However, it's not unlikely that some weird platforms / ancient
>> toolchains still have problems with __thread - even on Linux. We may
>> want to play safe and use pthread_key on POSIX.
>
> Why not make this kind of annotations available in qemu-commmon.h; or even
> better somewhere less... "generic".
Yes, we will need some encapsulation for this.
>
> #if defined(CONFIG_SUPPORTS_THREAD_KEYWORD)
>
> // use __thread
> #define QEMU_DECL_TLS(type, name) \
> extern __thread type name;
> #define QEMU_DEF_TLS(type, name) \
> __thread type name;
> #define QEMU_SET_TLS(name, value) \
> do { name = value; } while (0)
> #define QEMU_GET_TLS(name) \
> name
>
> #elif defined(CONFIG_SUPPORTS_PTHREAD_KEY)
>
> // use pthread_key_t
> #define QEMU_DECL_TLS(type, name) \
> extern type _type_##name; \
> extern pthread_key_t name;
> #define QEMU_DEF_TLS(type, name) \
> pthread_key_t name; \
> void _init_##name (void) __attribute__((constructor)); \
> void _init_##name (void) { pthread_key_create(&name, NULL); }
> #define QEMU_SET_TLS(name, value) \
> do { pthread_setspecific(name, (void*)value); } while (0)
> #define QEMU_GET_TLS(name) \
> ((typeof(_type_##name))pthread_getspecific(name))
>
> #else
> #error Go home
> #endif
Looks like a start. But I would avoid macros and go for (static inline)
functions where possible. And initialization should be explicit (so that
you can start using TLS already inside constructors).
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-04 17:26 ` Jan Kiszka
@ 2011-10-05 7:08 ` Paolo Bonzini
2011-10-05 7:52 ` Jan Kiszka
0 siblings, 1 reply; 20+ messages in thread
From: Paolo Bonzini @ 2011-10-05 7:08 UTC (permalink / raw)
To: Jan Kiszka
Cc: peter.maydell, agraf, Dr. David Alan Gilbert, qemu-devel, patches
[-- Attachment #1: Type: text/plain, Size: 512 bytes --]
On 10/04/2011 07:26 PM, Jan Kiszka wrote:
> Looks like a start. But I would avoid macros and go for (static inline)
> functions where possible. And initialization should be explicit (so that
> you can start using TLS already inside constructors).
Here is the patch I wrote to do more or less the same thing, plus
Windows support. It's a bit different in that I wrote a macro that can
be used as lvalue.
It doesn't let you use TLS inside constructors, however, unless you use
constructor priorities.
Paolo
[-- Attachment #2: tls-cpu-single-env.patch --]
[-- Type: text/x-patch, Size: 14517 bytes --]
>From 497ed0672f7fe08d9654a0e5c11b682bea43a59e Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Wed, 5 Oct 2011 08:29:39 +0200
Subject: [PATCH 0/3] *** SUBJECT HERE ***
*** BLURB HERE ***
Paolo Bonzini (3):
qemu-threads: add TLS wrappers
windows
tls
configure | 20 +++++++++++++++++
coroutine-win32.c | 7 ++++-
cpu-all.h | 4 ++-
cpus.c | 13 +++++++---
exec.c | 2 +-
qemu-thread-posix.c | 42 ++++++++++++++++++++++++++++++++---
qemu-thread-win32.c | 16 +++++++++++++
qemu-tls-gcc.h | 25 +++++++++++++++++++++
qemu-tls-pthread.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
qemu-tls-win32.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
10 files changed, 234 insertions(+), 12 deletions(-)
create mode 100644 qemu-tls-gcc.h
create mode 100644 qemu-tls-pthread.h
create mode 100644 qemu-tls-win32.h
--
1.7.6
>From d8c3c4e789f9b86a66042a9181333e1a096b6b93 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Tue, 16 Aug 2011 10:37:44 -0700
Subject: [PATCH 1/3] qemu-threads: add TLS wrappers
Win32 emulated TLS is slow and is not available on all versions of GCC;
some versions of Unix only have pthread_getspecific as a means to access
TLS.
Actually, Win32 does have support for decent TLS, and GCC does not map
__thread to it. But kind of unlike ELF TLS, it's perfectly possible
to declare TLS variables with simple C code! For pthread_getspecific
we similarly allocate a memory block; we have to compute all the offsets
at load time, which is also cheaper than doing a pthread_key_create for
each variable. Not optimal, but it works.
This patch adds wrappers to qemu-thread that will use __thread or
pthread_getspecific on POSIX systems, and the .tls segment on Windows.
It does kinda uglify the declarations, but not too much.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 20 +++++++++++++++++
coroutine-win32.c | 7 ++++-
qemu-thread-posix.c | 42 ++++++++++++++++++++++++++++++++---
qemu-thread-win32.c | 16 +++++++++++++
qemu-tls-gcc.h | 25 +++++++++++++++++++++
qemu-tls-pthread.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
qemu-tls-win32.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 221 insertions(+), 6 deletions(-)
create mode 100644 qemu-tls-gcc.h
create mode 100644 qemu-tls-pthread.h
create mode 100644 qemu-tls-win32.h
diff --git a/configure b/configure
index 59b1494..50d7b54 100755
--- a/configure
+++ b/configure
@@ -1215,6 +1215,23 @@ EOF
fi
##########################################
+# __thread check
+
+if test "$mingw32" = "yes" ; then
+ tls_model=win32
+else
+ cat > $TMPC << EOF
+__thread int x;
+int main() { return x; }
+EOF
+ if compile_prog "" "" ; then
+ tls_model=gcc
+ else
+ tls_model=pthread
+ fi
+fi
+
+##########################################
# zlib check
if test "$zlib" != "no" ; then
@@ -2697,6 +2714,7 @@ echo "Documentation $docs"
[ ! -z "$uname_release" ] && \
echo "uname -r $uname_release"
echo "NPTL support $nptl"
+echo "TLS support $tls_model"
echo "GUEST_BASE $guest_base"
echo "PIE user targets $user_pie"
echo "vde support $vde"
@@ -3580,6 +3598,8 @@ if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
esac
fi
+symlink $source_path/qemu-tls-$tls_model.h qemu-tls.h
+
# use included Linux headers
if test "$linux" = "yes" ; then
includes="-I\$(SRC_PATH)/linux-headers $includes"
diff --git a/coroutine-win32.c b/coroutine-win32.c
index 4179609..708e220 100644
--- a/coroutine-win32.c
+++ b/coroutine-win32.c
@@ -24,6 +24,7 @@
#include "qemu-common.h"
#include "qemu-coroutine-int.h"
+#include "qemu-tls.h"
typedef struct
{
@@ -33,8 +34,10 @@ typedef struct
CoroutineAction action;
} CoroutineWin32;
-static __thread CoroutineWin32 leader;
-static __thread Coroutine *current;
+static DEFINE_TLS(CoroutineWin32, tls_leader);
+static DEFINE_TLS(Coroutine *, tls_current);
+#define leader get_tls(tls_leader)
+#define current get_tls(tls_current)
CoroutineAction qemu_coroutine_switch(Coroutine *from_, Coroutine *to_,
CoroutineAction action)
diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c
index ac3c0c9..acd04ff 100644
--- a/qemu-thread-posix.c
+++ b/qemu-thread-posix.c
@@ -18,6 +18,9 @@
#include <stdint.h>
#include <string.h>
#include "qemu-thread.h"
+#include "qemu-common.h"
+#include "qemu-tls.h"
+#include "qemu-barrier.h"
static void error_exit(int err, const char *msg)
{
@@ -115,18 +118,44 @@ void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
error_exit(err, __func__);
}
+size_t tls_size;
+pthread_key_t tls_key;
+
+static void __attribute__((constructor(102))) tls_init_thread(void)
+{
+ /* It's easier to always create the key, even if using GCC tls. */
+ pthread_key_create(&tls_key, g_free);
+ _tls_init_thread();
+}
+
+typedef struct QemuThreadData {
+ void *(*start_routine)(void *);
+ void *arg;
+} QemuThreadData;
+
+static void *start_routine_wrapper(void *arg)
+{
+ QemuThreadData args = *(QemuThreadData *) arg;
+ g_free(arg);
+ _tls_init_thread();
+ return args.start_routine(args.arg);
+}
+
void qemu_thread_create(QemuThread *thread,
- void *(*start_routine)(void*),
+ void *(*start_routine)(void *),
void *arg)
{
+ sigset_t set, oldset;
+ QemuThreadData *args = g_malloc(sizeof(QemuThreadData));
int err;
- /* Leave signal handling to the iothread. */
- sigset_t set, oldset;
+ args->start_routine = start_routine;
+ args->arg = arg;
+ /* Leave signal handling to the iothread. */
sigfillset(&set);
pthread_sigmask(SIG_SETMASK, &set, &oldset);
- err = pthread_create(&thread->thread, NULL, start_routine, arg);
+ err = pthread_create(&thread->thread, NULL, start_routine_wrapper, args);
if (err)
error_exit(err, __func__);
diff --git a/qemu-thread-win32.c b/qemu-thread-win32.c
index db8e744..118d92f 100644
--- a/qemu-thread-win32.c
+++ b/qemu-thread-win32.c
@@ -16,6 +16,22 @@
#include <assert.h>
#include <limits.h>
+/* TLS support. */
+
+int __attribute__((section(".tls$000"))) _tls_start = 0;
+int __attribute__((section(".tls$ZZZ"))) _tls_end = 0;
+int _tls_index = 0;
+
+const IMAGE_TLS_DIRECTORY _tls_used __attribute__((used, section(".rdata$T"))) = {
+ (ULONG)(ULONG_PTR) &_tls_start, /* start of tls data */
+ (ULONG)(ULONG_PTR) &_tls_end, /* end of tls data */
+ (ULONG)(ULONG_PTR) &_tls_index, /* address of tls_index */
+ (ULONG) 0, /* pointer to callbacks */
+ (ULONG) 0, /* size of tls zero fill */
+ (ULONG) 0 /* characteristics */
+};
+
+
static void error_exit(int err, const char *msg)
{
char *pstr;
diff --git a/qemu-tls-gcc.h b/qemu-tls-gcc.h
new file mode 100644
index 0000000..8cff148
--- /dev/null
+++ b/qemu-tls-gcc.h
@@ -0,0 +1,24 @@
+/*
+ * TLS with __thread
+ *
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Paolo Bonzini <pbonzini@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_TLS_GCC_H
+#define QEMU_TLS_GCC_H
+
+#define DECLARE_TLS(type, x) extern __thread type tls__##x
+#define DEFINE_TLS(type, x) __thread type tls__##x
+#define get_tls(x) tls__##x
+
+static inline size_t tls_init(size_t size, size_t alignment) { return 0; }
+static inline void _tls_init_thread(void) {}
+
+#endif
diff --git a/qemu-tls-pthread.h b/qemu-tls-pthread.h
new file mode 100644
index 0000000..ef97528
--- /dev/null
+++ b/qemu-tls-pthread.h
@@ -0,0 +1,57 @@
+/*
+ * TLS with pthread_getspecific
+ *
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Paolo Bonzini <pbonzini@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_TLS_PTHREAD_H
+#define QEMU_TLS_PTHREAD_H
+
+#include <pthread.h>
+#include <glib.h>
+
+#define DECLARE_TLS(type, x) \
+ extern size_t tls_offset__##x; \
+ extern type tls_dummy__##x
+
+#define DEFINE_TLS(type, x) \
+ size_t tls_offset__##x; \
+ static void __attribute__((constructor(101))) tls_init__##x(void) \
+ { \
+ tls_offset__##x = tls_init(sizeof(type), __alignof__(type)); \
+ } \
+ extern type tls_dummy__##x
+
+extern size_t tls_size;
+extern pthread_key_t tls_key;
+
+static inline size_t tls_init(size_t size, size_t alignment)
+{
+ size_t tls_offset = (tls_size + alignment - 1) & -alignment;
+ tls_size = tls_offset + size;
+ return tls_offset;
+}
+
+static inline void _tls_init_thread(void)
+{
+ void *mem = tls_size == 0 ? NULL : g_malloc0(tls_size);
+ pthread_setspecific(tls_key, mem);
+}
+
+static inline __attribute__((__const__)) void *_get_tls(size_t offset)
+{
+ char *base = pthread_getspecific(tls_key);
+ return &base[offset];
+}
+
+#define get_tls(x) \
+ (*(__typeof__(&tls_dummy__##x)) _get_tls(tls_offset__##x))
+
+#endif
diff --git a/qemu-tls-win32.h b/qemu-tls-win32.h
new file mode 100644
index 0000000..d04d48b
--- /dev/null
+++ b/qemu-tls-win32.h
@@ -0,0 +1,59 @@
+/*
+ * TLS with Win32 .tls sections
+ *
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Paolo Bonzini <pbonzini@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_TLS_WIN32_H
+#define QEMU_TLS_WIN32_H
+
+#include <windows.h>
+#include <winnt.h>
+
+typedef struct _TEB {
+ NT_TIB NtTib;
+ void *EnvironmentPointer;
+ void *x[3];
+ char **ThreadLocalStoragePointer;
+} TEB, *PTEB;
+
+/* 1) The initial contents TLS variables is placed in the .tls section. */
+
+#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
+#define DEFINE_TLS(type, x) type tls__##x __attribute__((section(".tls$AAA")))
+
+/* 2) _tls_index holds the number of our module. The executable should be
+ zero, DLLs are numbered 1 and up. The loader fills it in for us. */
+
+extern int _tls_index;
+extern int _tls_start;
+static inline void _tls_init_thread(void) {}
+
+/* 3) Thus, Teb->ThreadLocalStoragePointer[_tls_index] is the base of
+ the TLS segment for this (thread, module) pair. Each segment has
+ the same layout as this module's .tls segment and is initialized
+ with the content of the .tls segment; 0 is the _tls_start variable.
+ So, get_tls passes us the offset of the passed variable relative to
+ _tls_start, and we return that same offset plus the base of segment. */
+
+static inline __attribute__((__const__)) void *_get_tls(size_t offset)
+{
+ PTEB Teb = NtCurrentTeb();
+ return (char *)(Teb->ThreadLocalStoragePointer[_tls_index]) + offset;
+}
+
+/* 4) get_tls, in addition to computing the offset, returns an lvalue.
+ "I got it. Magic." */
+
+#define get_tls(x) \
+ (*(__typeof__(tls__##x) *) \
+ _get_tls((ULONG_PTR)&(tls__##x) - (ULONG_PTR)&_tls_start))
+
+#endif
--
1.7.6
>From b10531473a833cf5e925f00461134b0bcd2295bb Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Mon, 29 Aug 2011 17:03:55 +0200
Subject: [PATCH 2/3] Prepare Windows port for thread-local cpu_single_env
Windows does not execute cpu_signal in VCPU-thread context,
so it won't be able to use cpu_single_env there. However,
it has the CPUState available, so nothing is lost.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
cpus.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/cpus.c b/cpus.c
index 8978779..822ce7a 100644
--- a/cpus.c
+++ b/cpus.c
@@ -176,10 +176,10 @@ static void cpu_handle_guest_debug(CPUState *env)
env->stopped = 1;
}
-static void cpu_signal(int sig)
+static inline void do_cpu_kick(CPUState *env)
{
- if (cpu_single_env) {
- cpu_exit(cpu_single_env);
+ if (env) {
+ cpu_exit(env);
}
exit_request = 1;
}
@@ -437,6 +437,11 @@ static void qemu_kvm_init_cpu_signals(CPUState *env)
}
}
+static void cpu_signal(int sig)
+{
+ do_cpu_kick(cpu_single_env);
+}
+
static void qemu_tcg_init_cpu_signals(void)
{
sigset_t set;
@@ -708,7 +713,7 @@ static void qemu_cpu_kick_thread(CPUState *env)
#else /* _WIN32 */
if (!qemu_cpu_is_self(env)) {
SuspendThread(env->thread->thread);
- cpu_signal(0);
+ do_cpu_kick(env);
ResumeThread(env->thread->thread);
}
#endif
--
1.7.6
>From 497ed0672f7fe08d9654a0e5c11b682bea43a59e Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Mon, 29 Aug 2011 17:04:01 +0200
Subject: [PATCH 3/3] Make cpu_single_env thread-local
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
cpu-all.h | 4 +++-
exec.c | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/cpu-all.h b/cpu-all.h
index 42a5fa0..da457dc 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -20,6 +20,7 @@
#define CPU_ALL_H
#include "qemu-common.h"
+#include "qemu-tls.h"
#include "cpu-common.h"
/* some important defines:
@@ -334,7 +335,8 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
GCC_FMT_ATTR(2, 3);
extern CPUState *first_cpu;
-extern CPUState *cpu_single_env;
+DECLARE_TLS(CPUState *,tls_cpu_single_env);
+#define cpu_single_env get_tls(tls_cpu_single_env)
/* Flags for use in ENV->INTERRUPT_PENDING.
diff --git a/exec.c b/exec.c
index d0cbf15..66b82db 100644
--- a/exec.c
+++ b/exec.c
@@ -120,7 +120,7 @@ static MemoryRegion *system_io;
CPUState *first_cpu;
/* current CPU in the current thread. It is only valid inside
cpu_exec() */
-CPUState *cpu_single_env;
+DEFINE_TLS(CPUState *,cpu_single_env);
/* 0 = Do not count executed instructions.
1 = Precise instruction counting.
2 = Adaptive rate instruction counting. */
--
1.7.6
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-05 7:08 ` Paolo Bonzini
@ 2011-10-05 7:52 ` Jan Kiszka
2011-10-05 9:21 ` Paolo Bonzini
0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2011-10-05 7:52 UTC (permalink / raw)
To: Paolo Bonzini
Cc: peter.maydell, agraf, Dr. David Alan Gilbert, qemu-devel, patches
[-- Attachment #1: Type: text/plain, Size: 1153 bytes --]
On 2011-10-05 09:08, Paolo Bonzini wrote:
> On 10/04/2011 07:26 PM, Jan Kiszka wrote:
>> Looks like a start. But I would avoid macros and go for (static inline)
>> functions where possible. And initialization should be explicit (so that
>> you can start using TLS already inside constructors).
>
> Here is the patch I wrote to do more or less the same thing, plus
> Windows support. It's a bit different in that I wrote a macro that can
> be used as lvalue.
Yeah, it probably makes sense to build the abstractions around __thread
so that - one day - we can drop the legacy wrappers.
Just do not prepend "tls__" in the gcc model (there is also some
inconsistency with prefixes in patch 3). And avoid leading "_" unless
they are dictated by the platform. And patch 3 needs to update
darwin-user/main.c as well.
>
> It doesn't let you use TLS inside constructors, however, unless you use
> constructor priorities.
What is the default priority of constructors BTW? You picked the
highest, will others that do not specify one have the same? Then we
could also define a QEMU_CONSTRUCTOR wrapper with a lower priority.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-05 7:52 ` Jan Kiszka
@ 2011-10-05 9:21 ` Paolo Bonzini
2011-10-07 17:29 ` David Gilbert
2011-10-26 14:03 ` Peter Maydell
0 siblings, 2 replies; 20+ messages in thread
From: Paolo Bonzini @ 2011-10-05 9:21 UTC (permalink / raw)
To: Jan Kiszka
Cc: peter.maydell, agraf, Dr. David Alan Gilbert, qemu-devel, patches
[-- Attachment #1: Type: text/plain, Size: 1586 bytes --]
On 10/05/2011 09:52 AM, Jan Kiszka wrote:
> Yeah, it probably makes sense to build the abstractions around __thread
> so that - one day - we can drop the legacy wrappers.
>
> Just do not prepend "tls__" in the gcc model
Actually I did that on purpose so that people would not forget get_tls. :)
> (there is also some inconsistency with prefixes in patch 3).
Yep, the attached v2 actually builds. I also needed a small change to
avoid errors with -Wredundant-decls, and I changed it to support arrays with
DECLARE_TLS(int[10], array);
> And avoid leading "_" unless
> they are dictated by the platform.
Ok, I replaced tls_init_thread with tls_init_main_thread and
_tls_init_thread with tls_init_thread.
> And patch 3 needs to update darwin-user/main.c as well.
I think the declaration can just be removed.
> What is the default priority of constructors BTW? You picked the
> highest, will others that do not specify one have the same?
Looks like the prioritized constructors always run _before_ the others,
which is good.
$ cat f.c
int f(void) __attribute__((constructor(101)));
int f(void) { write (1, "101\n", 4); }
int h(void) __attribute__((constructor));
int h(void) { write (1, "default\n", 8); }
int g(void) __attribute__((constructor(102)));
int g(void) { write (1, "102\n", 4); }
int main() { write(1, "main\n", 5); }
$ gcc f.c
$ ./a.out
101
102
default
main
If interested people can test the patches more and submit them more
formally, I'd be very glad. I wrote it for RCU, but of course that one
is not really going to be 1.0 material (even for 9p).
Paolo
[-- Attachment #2: tls-cpu-single-env.patch --]
[-- Type: text/x-patch, Size: 15263 bytes --]
>From 497ed0672f7fe08d9654a0e5c11b682bea43a59e Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Wed, 5 Oct 2011 08:29:39 +0200
Subject: [PATCH 0/3] *** SUBJECT HERE ***
*** BLURB HERE ***
Paolo Bonzini (3):
qemu-threads: add TLS wrappers
Prepare Windows port for thread-local cpu_single_env
Make cpu_single_env thread-local
configure | 20 +++++++++++++++++
coroutine-win32.c | 7 ++++-
cpu-all.h | 4 ++-
cpus.c | 13 +++++++---
exec.c | 2 +-
qemu-thread-posix.c | 42 ++++++++++++++++++++++++++++++++---
qemu-thread-win32.c | 16 +++++++++++++
qemu-tls-gcc.h | 25 +++++++++++++++++++++
qemu-tls-pthread.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
qemu-tls-win32.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
10 files changed, 234 insertions(+), 12 deletions(-)
create mode 100644 qemu-tls-gcc.h
create mode 100644 qemu-tls-pthread.h
create mode 100644 qemu-tls-win32.h
--
1.7.6
>From d8c3c4e789f9b86a66042a9181333e1a096b6b93 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Tue, 16 Aug 2011 10:37:44 -0700
Subject: [PATCH 1/3] qemu-threads: add TLS wrappers
Win32 emulated TLS is slow and is not available on all versions of GCC;
some versions of Unix only have pthread_getspecific as a means to access
TLS.
Actually, Win32 does have support for decent TLS, and GCC does not map
__thread to it. But kind of unlike ELF TLS, it's perfectly possible
to declare TLS variables with simple C code! For pthread_getspecific
we similarly allocate a memory block; we have to compute all the offsets
at load time, which is also cheaper than doing a pthread_key_create for
each variable. Not optimal, but it works.
This patch adds wrappers to qemu-thread that will use __thread or
pthread_getspecific on POSIX systems, and the .tls segment on Windows.
It does kinda uglify the declarations, but not too much.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 20 +++++++++++++++++
coroutine-win32.c | 7 ++++-
qemu-thread-posix.c | 42 ++++++++++++++++++++++++++++++++---
qemu-thread-win32.c | 16 +++++++++++++
qemu-tls-gcc.h | 25 +++++++++++++++++++++
qemu-tls-pthread.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
qemu-tls-win32.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 221 insertions(+), 6 deletions(-)
create mode 100644 qemu-tls-gcc.h
create mode 100644 qemu-tls-pthread.h
create mode 100644 qemu-tls-win32.h
diff --git a/configure b/configure
index 59b1494..50d7b54 100755
--- a/configure
+++ b/configure
@@ -1215,6 +1215,23 @@ EOF
fi
##########################################
+# __thread check
+
+if test "$mingw32" = "yes" ; then
+ tls_model=win32
+else
+ cat > $TMPC << EOF
+__thread int x;
+int main() { return x; }
+EOF
+ if compile_prog "" "" ; then
+ tls_model=gcc
+ else
+ tls_model=pthread
+ fi
+fi
+
+##########################################
# zlib check
if test "$zlib" != "no" ; then
@@ -2697,6 +2714,7 @@ echo "Documentation $docs"
[ ! -z "$uname_release" ] && \
echo "uname -r $uname_release"
echo "NPTL support $nptl"
+echo "TLS support $tls_model"
echo "GUEST_BASE $guest_base"
echo "PIE user targets $user_pie"
echo "vde support $vde"
@@ -3580,6 +3598,8 @@ if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
esac
fi
+symlink $source_path/qemu-tls-$tls_model.h qemu-tls.h
+
# use included Linux headers
if test "$linux" = "yes" ; then
includes="-I\$(SRC_PATH)/linux-headers $includes"
diff --git a/coroutine-win32.c b/coroutine-win32.c
index 4179609..708e220 100644
--- a/coroutine-win32.c
+++ b/coroutine-win32.c
@@ -24,6 +24,7 @@
#include "qemu-common.h"
#include "qemu-coroutine-int.h"
+#include "qemu-tls.h"
typedef struct
{
@@ -33,8 +34,10 @@ typedef struct
CoroutineAction action;
} CoroutineWin32;
-static __thread CoroutineWin32 leader;
-static __thread Coroutine *current;
+static DEFINE_TLS(CoroutineWin32, tls_leader);
+static DEFINE_TLS(Coroutine *, tls_current);
+#define leader get_tls(tls_leader)
+#define current get_tls(tls_current)
CoroutineAction qemu_coroutine_switch(Coroutine *from_, Coroutine *to_,
CoroutineAction action)
diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c
index ac3c0c9..acd04ff 100644
--- a/qemu-thread-posix.c
+++ b/qemu-thread-posix.c
@@ -18,6 +18,9 @@
#include <stdint.h>
#include <string.h>
#include "qemu-thread.h"
+#include "qemu-common.h"
+#include "qemu-tls.h"
+#include "qemu-barrier.h"
static void error_exit(int err, const char *msg)
{
@@ -115,18 +118,44 @@ void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
error_exit(err, __func__);
}
+size_t tls_size;
+pthread_key_t tls_key;
+
+static void __attribute__((constructor(102))) tls_init_main_thread(void)
+{
+ /* It's easier to always create the key, even if using GCC tls. */
+ pthread_key_create(&tls_key, g_free);
+ tls_init_thread();
+}
+
+typedef struct QemuThreadData {
+ void *(*start_routine)(void *);
+ void *arg;
+} QemuThreadData;
+
+static void *start_routine_wrapper(void *arg)
+{
+ QemuThreadData args = *(QemuThreadData *) arg;
+ g_free(arg);
+ tls_init_thread();
+ return args.start_routine(args.arg);
+}
+
void qemu_thread_create(QemuThread *thread,
- void *(*start_routine)(void*),
+ void *(*start_routine)(void *),
void *arg)
{
+ sigset_t set, oldset;
+ QemuThreadData *args = g_malloc(sizeof(QemuThreadData));
int err;
- /* Leave signal handling to the iothread. */
- sigset_t set, oldset;
+ args->start_routine = start_routine;
+ args->arg = arg;
+ /* Leave signal handling to the iothread. */
sigfillset(&set);
pthread_sigmask(SIG_SETMASK, &set, &oldset);
- err = pthread_create(&thread->thread, NULL, start_routine, arg);
+ err = pthread_create(&thread->thread, NULL, start_routine_wrapper, args);
if (err)
error_exit(err, __func__);
diff --git a/qemu-thread-win32.c b/qemu-thread-win32.c
index db8e744..118d92f 100644
--- a/qemu-thread-win32.c
+++ b/qemu-thread-win32.c
@@ -16,6 +16,22 @@
#include <assert.h>
#include <limits.h>
+/* TLS support. */
+
+int __attribute__((section(".tls$000"))) _tls_start = 0;
+int __attribute__((section(".tls$ZZZ"))) _tls_end = 0;
+int _tls_index = 0;
+
+const IMAGE_TLS_DIRECTORY _tls_used __attribute__((used, section(".rdata$T"))) = {
+ (ULONG)(ULONG_PTR) &_tls_start, /* start of tls data */
+ (ULONG)(ULONG_PTR) &_tls_end, /* end of tls data */
+ (ULONG)(ULONG_PTR) &_tls_index, /* address of tls_index */
+ (ULONG) 0, /* pointer to callbacks */
+ (ULONG) 0, /* size of tls zero fill */
+ (ULONG) 0 /* characteristics */
+};
+
+
static void error_exit(int err, const char *msg)
{
char *pstr;
diff --git a/qemu-tls-gcc.h b/qemu-tls-gcc.h
new file mode 100644
index 0000000..8cff148
--- /dev/null
+++ b/qemu-tls-gcc.h
@@ -0,0 +1,24 @@
+/*
+ * TLS with __thread
+ *
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Paolo Bonzini <pbonzini@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_TLS_GCC_H
+#define QEMU_TLS_GCC_H
+
+#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
+#define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x
+#define get_tls(x) tls__##x
+
+static inline size_t tls_init(size_t size, size_t alignment) { return 0; }
+static inline void tls_init_thread(void) {}
+
+#endif
diff --git a/qemu-tls-pthread.h b/qemu-tls-pthread.h
new file mode 100644
index 0000000..ef97528
--- /dev/null
+++ b/qemu-tls-pthread.h
@@ -0,0 +1,59 @@
+/*
+ * TLS with pthread_getspecific
+ *
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Paolo Bonzini <pbonzini@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_TLS_PTHREAD_H
+#define QEMU_TLS_PTHREAD_H
+
+#include <pthread.h>
+#include <glib.h>
+
+#define DECLARE_TLS(type, x) \
+ extern size_t tls_offset__##x; \
+ extern __typeof__(type) *tls_dummy__##x(void)
+
+#define DEFINE_TLS(type, x) \
+ size_t tls_offset__##x; \
+ static void __attribute__((constructor(101))) tls_init__##x(void) { \
+ tls_offset__##x = tls_init(sizeof(type), __alignof__(type)); \
+ } \
+ extern inline __attribute__((__gnu_inline__)) __typeof__(type) *tls_dummy__##x(void) { \
+ return NULL; \
+ } \
+ extern size_t tls_swallow_semicolon__##x
+
+extern size_t tls_size;
+extern pthread_key_t tls_key;
+
+static inline size_t tls_init(size_t size, size_t alignment)
+{
+ size_t tls_offset = (tls_size + alignment - 1) & -alignment;
+ tls_size = tls_offset + size;
+ return tls_offset;
+}
+
+static inline void tls_init_thread(void)
+{
+ void *mem = tls_size == 0 ? NULL : g_malloc0(tls_size);
+ pthread_setspecific(tls_key, mem);
+}
+
+static inline __attribute__((__const__)) void *_get_tls(size_t offset)
+{
+ char *base = pthread_getspecific(tls_key);
+ return &base[offset];
+}
+
+#define get_tls(x) \
+ (*(__typeof__(tls_dummy__##x())) _get_tls(tls_offset__##x))
+
+#endif
diff --git a/qemu-tls-win32.h b/qemu-tls-win32.h
new file mode 100644
index 0000000..d04d48b
--- /dev/null
+++ b/qemu-tls-win32.h
@@ -0,0 +1,59 @@
+/*
+ * TLS with Win32 .tls sections
+ *
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Paolo Bonzini <pbonzini@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_TLS_WIN32_H
+#define QEMU_TLS_WIN32_H
+
+#include <windows.h>
+#include <winnt.h>
+
+typedef struct _TEB {
+ NT_TIB NtTib;
+ void *EnvironmentPointer;
+ void *x[3];
+ char **ThreadLocalStoragePointer;
+} TEB, *PTEB;
+
+/* 1) The initial contents TLS variables is placed in the .tls section. */
+
+#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
+#define DEFINE_TLS(type, x) __typeof__(type) tls__##x __attribute__((section(".tls$AAA")))
+
+/* 2) _tls_index holds the number of our module. The executable should be
+ zero, DLLs are numbered 1 and up. The loader fills it in for us. */
+
+extern int _tls_index;
+extern int _tls_start;
+static inline void tls_init_thread(void) {}
+
+/* 3) Thus, Teb->ThreadLocalStoragePointer[_tls_index] is the base of
+ the TLS segment for this (thread, module) pair. Each segment has
+ the same layout as this module's .tls segment and is initialized
+ with the content of the .tls segment; 0 is the _tls_start variable.
+ So, get_tls passes us the offset of the passed variable relative to
+ _tls_start, and we return that same offset plus the base of segment. */
+
+static inline __attribute__((__const__)) void *_get_tls(size_t offset)
+{
+ PTEB Teb = NtCurrentTeb();
+ return (char *)(Teb->ThreadLocalStoragePointer[_tls_index]) + offset;
+}
+
+/* 4) get_tls, in addition to computing the offset, returns an lvalue.
+ "I got it. Magic." */
+
+#define get_tls(x) \
+ (*(__typeof__(tls__##x) *) \
+ _get_tls((ULONG_PTR)&(tls__##x) - (ULONG_PTR)&_tls_start))
+
+#endif
--
1.7.6
>From b10531473a833cf5e925f00461134b0bcd2295bb Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Mon, 29 Aug 2011 17:03:55 +0200
Subject: [PATCH 2/3] Prepare Windows port for thread-local cpu_single_env
Windows does not execute cpu_signal in VCPU-thread context,
so it won't be able to use cpu_single_env there. However,
it has the CPUState available, so nothing is lost.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
cpus.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/cpus.c b/cpus.c
index 8978779..822ce7a 100644
--- a/cpus.c
+++ b/cpus.c
@@ -176,10 +176,10 @@ static void cpu_handle_guest_debug(CPUState *env)
env->stopped = 1;
}
-static void cpu_signal(int sig)
+static inline void do_cpu_kick(CPUState *env)
{
- if (cpu_single_env) {
- cpu_exit(cpu_single_env);
+ if (env) {
+ cpu_exit(env);
}
exit_request = 1;
}
@@ -437,6 +437,11 @@ static void qemu_kvm_init_cpu_signals(CPUState *env)
}
}
+static void cpu_signal(int sig)
+{
+ do_cpu_kick(cpu_single_env);
+}
+
static void qemu_tcg_init_cpu_signals(void)
{
sigset_t set;
@@ -708,7 +713,7 @@ static void qemu_cpu_kick_thread(CPUState *env)
#else /* _WIN32 */
if (!qemu_cpu_is_self(env)) {
SuspendThread(env->thread->thread);
- cpu_signal(0);
+ do_cpu_kick(env);
ResumeThread(env->thread->thread);
}
#endif
--
1.7.6
>From 6dd053d0acc0f0334432259d989329a4c688fe63 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Mon, 29 Aug 2011 17:04:01 +0200
Subject: [PATCH 3/3] Make cpu_single_env thread-local
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
cpu-all.h | 4 +++-
darwin-user/main.c | 2 --
exec.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/cpu-all.h b/cpu-all.h
index 42a5fa0..e37ebfc 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -20,6 +20,7 @@
#define CPU_ALL_H
#include "qemu-common.h"
+#include "qemu-tls.h"
#include "cpu-common.h"
/* some important defines:
@@ -334,7 +335,8 @@ void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
GCC_FMT_ATTR(2, 3);
extern CPUState *first_cpu;
-extern CPUState *cpu_single_env;
+DECLARE_TLS(CPUState *,tls_cpu_single_env);
+#define cpu_single_env get_tls(tls_cpu_single_env)
/* Flags for use in ENV->INTERRUPT_PENDING.
diff --git a/darwin-user/main.c b/darwin-user/main.c
index 1a881a0..c0f14f8 100644
--- a/darwin-user/main.c
+++ b/darwin-user/main.c
@@ -729,8 +729,6 @@ static void usage(void)
/* XXX: currently only used for async signals (see signal.c) */
CPUState *global_env;
-/* used only if single thread */
-CPUState *cpu_single_env = NULL;
/* used to free thread contexts */
TaskState *first_task_state;
diff --git a/exec.c b/exec.c
index d0cbf15..afc5fe3 100644
--- a/exec.c
+++ b/exec.c
@@ -120,7 +120,7 @@ static MemoryRegion *system_io;
CPUState *first_cpu;
/* current CPU in the current thread. It is only valid inside
cpu_exec() */
-CPUState *cpu_single_env;
+DEFINE_TLS(CPUState *,tls_cpu_single_env);
/* 0 = Do not count executed instructions.
1 = Precise instruction counting.
2 = Adaptive rate instruction counting. */
--
1.7.6
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-05 9:21 ` Paolo Bonzini
@ 2011-10-07 17:29 ` David Gilbert
2011-10-08 13:41 ` Paolo Bonzini
2011-10-26 14:03 ` Peter Maydell
1 sibling, 1 reply; 20+ messages in thread
From: David Gilbert @ 2011-10-07 17:29 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: peter.maydell, agraf, Jan Kiszka, qemu-devel, patches
On 5 October 2011 10:21, Paolo Bonzini <pbonzini@redhat.com> wrote:
> If interested people can test the patches more and submit them more
> formally, I'd be very glad. I wrote it for RCU, but of course that one is
> not really going to be 1.0 material (even for 9p).
Hmm this got a bit more complex than the original patch; still it covers a lot
more bases.
Should this also replace the THREAD that's defined in
linux-user/qemu.h and bsd-user/qemu.h (that is __thread if built with
NPTL)?
It seems to only be there for 'thread_env' which is also a CPUState*
(hmm - what state does that contain that cpu_single_env doesn't?)
Dave
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-07 17:29 ` David Gilbert
@ 2011-10-08 13:41 ` Paolo Bonzini
0 siblings, 0 replies; 20+ messages in thread
From: Paolo Bonzini @ 2011-10-08 13:41 UTC (permalink / raw)
To: David Gilbert; +Cc: peter.maydell, patches, Jan Kiszka, agraf, qemu-devel
On 10/07/2011 07:29 PM, David Gilbert wrote:
> Hmm this got a bit more complex than the original patch; still it covers a lot
> more bases.
>
> Should this also replace the THREAD that's defined in
> linux-user/qemu.h and bsd-user/qemu.h (that is __thread if built with
> NPTL)?
> It seems to only be there for 'thread_env' which is also a CPUState*
> (hmm - what state does that contain that cpu_single_env doesn't?)
Yes, I wouldn't be surprised if thread_env can just go. That would be a
separate cleanup, however.
Paolo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-05 9:21 ` Paolo Bonzini
2011-10-07 17:29 ` David Gilbert
@ 2011-10-26 14:03 ` Peter Maydell
2011-10-26 14:39 ` Paolo Bonzini
1 sibling, 1 reply; 20+ messages in thread
From: Peter Maydell @ 2011-10-26 14:03 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Dr. David Alan Gilbert, agraf, Jan Kiszka, qemu-devel, patches
On 5 October 2011 10:21, Paolo Bonzini <pbonzini@redhat.com> wrote:
[tls patches]
> If interested people can test the patches more and submit them more
> formally, I'd be very glad. I wrote it for RCU, but of course that one is
> not really going to be 1.0 material (even for 9p).
For the record (since I think we only talked about this on IRC):
* the POSIX TLS fallback code doesn't work on Linux hosts for
linux-user emulation (the constructor is never called to set up
the TLS for the main thread, probably something to do with our
custom linker script, since it does work OK for system emulation)
* if I recall correctly from IRC it doesn't compile on OpenBSD
so for 1.0 perhaps we need to fall back to a simpler set of patches
that just avoid the regression in thread support for linux-user ?
-- PMM
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 14:03 ` Peter Maydell
@ 2011-10-26 14:39 ` Paolo Bonzini
2011-10-26 14:54 ` Peter Maydell
0 siblings, 1 reply; 20+ messages in thread
From: Paolo Bonzini @ 2011-10-26 14:39 UTC (permalink / raw)
To: Peter Maydell
Cc: Dr. David Alan Gilbert, agraf, Jan Kiszka, qemu-devel, patches
On 10/26/2011 04:03 PM, Peter Maydell wrote:
> For the record (since I think we only talked about this on IRC):
> * the POSIX TLS fallback code doesn't work on Linux hosts for
> linux-user emulation (the constructor is never called to set up
> the TLS for the main thread, probably something to do with our
> custom linker script, since it does work OK for system emulation)
> * if I recall correctly from IRC it doesn't compile on OpenBSD
>
> so for 1.0 perhaps we need to fall back to a simpler set of patches
> that just avoid the regression in thread support for linux-user ?
I agree.
Paolo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 14:39 ` Paolo Bonzini
@ 2011-10-26 14:54 ` Peter Maydell
2011-10-26 14:59 ` Paolo Bonzini
2011-10-26 15:02 ` Jan Kiszka
0 siblings, 2 replies; 20+ messages in thread
From: Peter Maydell @ 2011-10-26 14:54 UTC (permalink / raw)
To: Paolo Bonzini
Cc: Dr. David Alan Gilbert, agraf, Jan Kiszka, qemu-devel, patches
On 26 October 2011 15:39, Paolo Bonzini <pbonzini@redhat.com> wrote:
> On 10/26/2011 04:03 PM, Peter Maydell wrote:
>>
>> For the record (since I think we only talked about this on IRC):
>> * the POSIX TLS fallback code doesn't work on Linux hosts for
>> linux-user emulation (the constructor is never called to set up
>> the TLS for the main thread, probably something to do with our
>> custom linker script, since it does work OK for system emulation)
>> * if I recall correctly from IRC it doesn't compile on OpenBSD
>>
>> so for 1.0 perhaps we need to fall back to a simpler set of patches
>> that just avoid the regression in thread support for linux-user ?
>
> I agree.
I was thinking something like a trivial qemu-tls.h which does
#ifdef __linux__
#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
#define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x
#define get_tls(x) tls__##x
#else
/* Dummy implementations -- we can get away with this because system
* mode is effectively single-threaded for our current limited use of
* TLS, and the only -user mode which supports multiple threads is
* linux-user.
* TODO: proper implementations via Win32 .tls sections and
* POSIX pthread_getspecific.
*/
#define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
#define DEFINE_TLS(type, x) __typeof__(type) tls__##x
#define get_tls(x) tls__##x
#endif
and then we can just use your "Make cpu_single_env thread-local"
patch as-is:
http://git.linaro.org/gitweb?p=people/pmaydell/qemu-arm.git;a=commitdiff;h=b674559fc8a67ae7d30fe3ab3062d5855ac77d2d
(for that matter we could apply the "Prepare Windows port for
thread-local cpu_single_env" patch too, but that's not a requirement.)
-- PMM
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 14:54 ` Peter Maydell
@ 2011-10-26 14:59 ` Paolo Bonzini
2011-10-26 15:02 ` Jan Kiszka
1 sibling, 0 replies; 20+ messages in thread
From: Paolo Bonzini @ 2011-10-26 14:59 UTC (permalink / raw)
To: Peter Maydell
Cc: Dr. David Alan Gilbert, agraf, Jan Kiszka, qemu-devel, patches
On 10/26/2011 04:54 PM, Peter Maydell wrote:
> On 26 October 2011 15:39, Paolo Bonzini<pbonzini@redhat.com> wrote:
>> On 10/26/2011 04:03 PM, Peter Maydell wrote:
>>>
>>> For the record (since I think we only talked about this on IRC):
>>> * the POSIX TLS fallback code doesn't work on Linux hosts for
>>> linux-user emulation (the constructor is never called to set up
>>> the TLS for the main thread, probably something to do with our
>>> custom linker script, since it does work OK for system emulation)
>>> * if I recall correctly from IRC it doesn't compile on OpenBSD
>>>
>>> so for 1.0 perhaps we need to fall back to a simpler set of patches
>>> that just avoid the regression in thread support for linux-user ?
>>
>> I agree.
>
> I was thinking something like a trivial qemu-tls.h which does
>
> #ifdef __linux__
> #define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
> #define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x
> #define get_tls(x) tls__##x
> #else
> /* Dummy implementations -- we can get away with this because system
> * mode is effectively single-threaded for our current limited use of
> * TLS, and the only -user mode which supports multiple threads is
> * linux-user.
> * TODO: proper implementations via Win32 .tls sections and
> * POSIX pthread_getspecific.
> */
> #define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
> #define DEFINE_TLS(type, x) __typeof__(type) tls__##x
> #define get_tls(x) tls__##x
> #endif
>
> and then we can just use your "Make cpu_single_env thread-local"
> patch as-is:
>
> http://git.linaro.org/gitweb?p=people/pmaydell/qemu-arm.git;a=commitdiff;h=b674559fc8a67ae7d30fe3ab3062d5855ac77d2d
>
> (for that matter we could apply the "Prepare Windows port for
> thread-local cpu_single_env" patch too, but that's not a requirement.)
That would be fine.
Paolo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 14:54 ` Peter Maydell
2011-10-26 14:59 ` Paolo Bonzini
@ 2011-10-26 15:02 ` Jan Kiszka
2011-10-26 15:09 ` Peter Maydell
1 sibling, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2011-10-26 15:02 UTC (permalink / raw)
To: Peter Maydell
Cc: Paolo Bonzini, agraf, Dr. David Alan Gilbert, qemu-devel, patches
On 2011-10-26 16:54, Peter Maydell wrote:
> On 26 October 2011 15:39, Paolo Bonzini <pbonzini@redhat.com> wrote:
>> On 10/26/2011 04:03 PM, Peter Maydell wrote:
>>>
>>> For the record (since I think we only talked about this on IRC):
>>> * the POSIX TLS fallback code doesn't work on Linux hosts for
>>> linux-user emulation (the constructor is never called to set up
>>> the TLS for the main thread, probably something to do with our
>>> custom linker script, since it does work OK for system emulation)
>>> * if I recall correctly from IRC it doesn't compile on OpenBSD
>>>
>>> so for 1.0 perhaps we need to fall back to a simpler set of patches
>>> that just avoid the regression in thread support for linux-user ?
>>
>> I agree.
>
> I was thinking something like a trivial qemu-tls.h which does
>
> #ifdef __linux__
> #define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
> #define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x
> #define get_tls(x) tls__##x
> #else
> /* Dummy implementations -- we can get away with this because system
> * mode is effectively single-threaded for our current limited use of
> * TLS, and the only -user mode which supports multiple threads is
> * linux-user.
We will use it in system mode as well, e.g. when I'll push away the
global lock from KVM entry/exits. So let's state that it is only
interesting on Linux hosts for now.
Otherwise, this looks good.
Jan
> * TODO: proper implementations via Win32 .tls sections and
> * POSIX pthread_getspecific.
> */
> #define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
> #define DEFINE_TLS(type, x) __typeof__(type) tls__##x
> #define get_tls(x) tls__##x
> #endif
>
> and then we can just use your "Make cpu_single_env thread-local"
> patch as-is:
>
> http://git.linaro.org/gitweb?p=people/pmaydell/qemu-arm.git;a=commitdiff;h=b674559fc8a67ae7d30fe3ab3062d5855ac77d2d
>
> (for that matter we could apply the "Prepare Windows port for
> thread-local cpu_single_env" patch too, but that's not a requirement.)
>
> -- PMM
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 15:02 ` Jan Kiszka
@ 2011-10-26 15:09 ` Peter Maydell
2011-10-26 15:13 ` Jan Kiszka
0 siblings, 1 reply; 20+ messages in thread
From: Peter Maydell @ 2011-10-26 15:09 UTC (permalink / raw)
To: Jan Kiszka
Cc: Paolo Bonzini, agraf, Dr. David Alan Gilbert, qemu-devel, patches
On 26 October 2011 16:02, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> On 2011-10-26 16:54, Peter Maydell wrote:
>> On 26 October 2011 15:39, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>> On 10/26/2011 04:03 PM, Peter Maydell wrote:
>>>>
>>>> For the record (since I think we only talked about this on IRC):
>>>> * the POSIX TLS fallback code doesn't work on Linux hosts for
>>>> linux-user emulation (the constructor is never called to set up
>>>> the TLS for the main thread, probably something to do with our
>>>> custom linker script, since it does work OK for system emulation)
>>>> * if I recall correctly from IRC it doesn't compile on OpenBSD
>>>>
>>>> so for 1.0 perhaps we need to fall back to a simpler set of patches
>>>> that just avoid the regression in thread support for linux-user ?
>>>
>>> I agree.
>>
>> I was thinking something like a trivial qemu-tls.h which does
>>
>> #ifdef __linux__
>> #define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
>> #define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x
>> #define get_tls(x) tls__##x
>> #else
>> /* Dummy implementations -- we can get away with this because system
>> * mode is effectively single-threaded for our current limited use of
>> * TLS, and the only -user mode which supports multiple threads is
>> * linux-user.
>
> We will use it in system mode as well, e.g. when I'll push away the
> global lock from KVM entry/exits. So let's state that it is only
> interesting on Linux hosts for now.
>
> Otherwise, this looks good.
The point of the comment is that you can't use this facility in
system mode until we've added the non-Linux support (because you'd
break Win32 &c). So fixing and committing the non-Linux support is
a prerequisite for anything like the global lock moves. I can be
a bit more explicit about that if you like:
/* Dummy implementations -- we can get away with this because system
* mode is effectively single-threaded for our current limited use of
* TLS, and the only -user mode which supports multiple threads is
* linux-user.
* This means you cannot use this for any variables which will
* actually be accessed by more than one thread in system mode
* until the implementations for Win32 and POSIX systems without
* __thread have been added!
*
* TODO: add implementations via Win32 .tls sections and
* POSIX pthread_getspecific.
*/
-- PMM
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 15:09 ` Peter Maydell
@ 2011-10-26 15:13 ` Jan Kiszka
2011-10-26 15:18 ` Peter Maydell
0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2011-10-26 15:13 UTC (permalink / raw)
To: Peter Maydell
Cc: Paolo Bonzini, agraf@suse.de, Dr. David Alan Gilbert,
qemu-devel@nongnu.org, patches@linaro.org
On 2011-10-26 17:09, Peter Maydell wrote:
> On 26 October 2011 16:02, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>> On 2011-10-26 16:54, Peter Maydell wrote:
>>> On 26 October 2011 15:39, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>>> On 10/26/2011 04:03 PM, Peter Maydell wrote:
>>>>>
>>>>> For the record (since I think we only talked about this on IRC):
>>>>> * the POSIX TLS fallback code doesn't work on Linux hosts for
>>>>> linux-user emulation (the constructor is never called to set up
>>>>> the TLS for the main thread, probably something to do with our
>>>>> custom linker script, since it does work OK for system emulation)
>>>>> * if I recall correctly from IRC it doesn't compile on OpenBSD
>>>>>
>>>>> so for 1.0 perhaps we need to fall back to a simpler set of patches
>>>>> that just avoid the regression in thread support for linux-user ?
>>>>
>>>> I agree.
>>>
>>> I was thinking something like a trivial qemu-tls.h which does
>>>
>>> #ifdef __linux__
>>> #define DECLARE_TLS(type, x) extern DEFINE_TLS(type, x)
>>> #define DEFINE_TLS(type, x) __thread __typeof__(type) tls__##x
>>> #define get_tls(x) tls__##x
>>> #else
>>> /* Dummy implementations -- we can get away with this because system
>>> * mode is effectively single-threaded for our current limited use of
>>> * TLS, and the only -user mode which supports multiple threads is
>>> * linux-user.
>>
>> We will use it in system mode as well, e.g. when I'll push away the
>> global lock from KVM entry/exits. So let's state that it is only
>> interesting on Linux hosts for now.
>>
>> Otherwise, this looks good.
>
> The point of the comment is that you can't use this facility in
> system mode until we've added the non-Linux support (because you'd
> break Win32 &c). So fixing and committing the non-Linux support is
> a prerequisite for anything like the global lock moves. I can be
> a bit more explicit about that if you like:
>
> /* Dummy implementations -- we can get away with this because system
> * mode is effectively single-threaded for our current limited use of
> * TLS, and the only -user mode which supports multiple threads is
> * linux-user.
> * This means you cannot use this for any variables which will
> * actually be accessed by more than one thread in system mode
> * until the implementations for Win32 and POSIX systems without
> * __thread have been added!
> *
> * TODO: add implementations via Win32 .tls sections and
> * POSIX pthread_getspecific.
> */
>
> -- PMM
My point is that it is fine to use for per-vcpu variables because:
- they are single-threaded in TCG mode
- they are multi-threaded in KVM mode, but that's only affecting Linux
hosts for which this TLS wrapper is already usable
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 15:13 ` Jan Kiszka
@ 2011-10-26 15:18 ` Peter Maydell
2011-10-26 16:02 ` Jan Kiszka
0 siblings, 1 reply; 20+ messages in thread
From: Peter Maydell @ 2011-10-26 15:18 UTC (permalink / raw)
To: Jan Kiszka
Cc: Paolo Bonzini, agraf@suse.de, Dr. David Alan Gilbert,
qemu-devel@nongnu.org, patches@linaro.org
On 26 October 2011 16:13, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> My point is that it is fine to use for per-vcpu variables because:
> - they are single-threaded in TCG mode
> - they are multi-threaded in KVM mode, but that's only affecting Linux
> hosts for which this TLS wrapper is already usable
Oh, I see. Feel free to suggest reworded comment text :-)
-- PMM
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 15:18 ` Peter Maydell
@ 2011-10-26 16:02 ` Jan Kiszka
2011-10-26 16:27 ` Andreas Färber
0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2011-10-26 16:02 UTC (permalink / raw)
To: Peter Maydell
Cc: Paolo Bonzini, agraf@suse.de, Dr. David Alan Gilbert,
qemu-devel@nongnu.org, patches@linaro.org
On 2011-10-26 17:18, Peter Maydell wrote:
> On 26 October 2011 16:13, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>> My point is that it is fine to use for per-vcpu variables because:
>> - they are single-threaded in TCG mode
>> - they are multi-threaded in KVM mode, but that's only affecting Linux
>> hosts for which this TLS wrapper is already usable
>
> Oh, I see. Feel free to suggest reworded comment text :-)
/* Dummy implementations -- we can get away with this because
* - we confine the use to per-VCPU variables
* - only linux-user supports multiple VCPU threads
* - TCG system mode is single-threaded regarding VCPUs
* - KVM system mode is multi-threaded but limited to Linux
OK?
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 16:02 ` Jan Kiszka
@ 2011-10-26 16:27 ` Andreas Färber
2011-10-26 16:31 ` Jan Kiszka
0 siblings, 1 reply; 20+ messages in thread
From: Andreas Färber @ 2011-10-26 16:27 UTC (permalink / raw)
To: Jan Kiszka
Cc: Peter Maydell, Dr. David Alan Gilbert, patches@linaro.org,
qemu-devel@nongnu.org, agraf@suse.de, Paolo Bonzini
Am 26.10.2011 18:02, schrieb Jan Kiszka:
> On 2011-10-26 17:18, Peter Maydell wrote:
>> On 26 October 2011 16:13, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>>> My point is that it is fine to use for per-vcpu variables because:
>>> - they are single-threaded in TCG mode
>>> - they are multi-threaded in KVM mode, but that's only affecting Linux
>>> hosts for which this TLS wrapper is already usable
>>
>> Oh, I see. Feel free to suggest reworded comment text :-)
>
> /* Dummy implementations -- we can get away with this because
> * - we confine the use to per-VCPU variables
> * - only linux-user supports multiple VCPU threads
> * - TCG system mode is single-threaded regarding VCPUs
> * - KVM system mode is multi-threaded but limited to Linux
There was a port of KVM to illumos-derived SmartOS. But I don't see an
easy way to error out on non-Linux KVM hosts without breaking TCG, too.
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now)
2011-10-26 16:27 ` Andreas Färber
@ 2011-10-26 16:31 ` Jan Kiszka
0 siblings, 0 replies; 20+ messages in thread
From: Jan Kiszka @ 2011-10-26 16:31 UTC (permalink / raw)
To: Andreas Färber
Cc: Peter Maydell, Dr. David Alan Gilbert, patches@linaro.org,
qemu-devel@nongnu.org, agraf@suse.de, Paolo Bonzini
On 2011-10-26 18:27, Andreas Färber wrote:
> Am 26.10.2011 18:02, schrieb Jan Kiszka:
>> On 2011-10-26 17:18, Peter Maydell wrote:
>>> On 26 October 2011 16:13, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>>>> My point is that it is fine to use for per-vcpu variables because:
>>>> - they are single-threaded in TCG mode
>>>> - they are multi-threaded in KVM mode, but that's only affecting Linux
>>>> hosts for which this TLS wrapper is already usable
>>>
>>> Oh, I see. Feel free to suggest reworded comment text :-)
>>
>> /* Dummy implementations -- we can get away with this because
>> * - we confine the use to per-VCPU variables
>> * - only linux-user supports multiple VCPU threads
>> * - TCG system mode is single-threaded regarding VCPUs
>
>> * - KVM system mode is multi-threaded but limited to Linux
>
> There was a port of KVM to illumos-derived SmartOS. But I don't see an
> easy way to error out on non-Linux KVM hosts without breaking TCG, too.
And I would be surprised to see them running with zero QEMU patches. So
they are not upstream, thus slightly outside our radar.
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2011-10-26 16:31 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-03 16:33 [Qemu-devel] [PATCH] Make cpu_single_env thread local (Linux only for now) Dr. David Alan Gilbert
2011-10-03 17:51 ` Jan Kiszka
2011-10-04 15:10 ` Lluís Vilanova
2011-10-04 17:26 ` Jan Kiszka
2011-10-05 7:08 ` Paolo Bonzini
2011-10-05 7:52 ` Jan Kiszka
2011-10-05 9:21 ` Paolo Bonzini
2011-10-07 17:29 ` David Gilbert
2011-10-08 13:41 ` Paolo Bonzini
2011-10-26 14:03 ` Peter Maydell
2011-10-26 14:39 ` Paolo Bonzini
2011-10-26 14:54 ` Peter Maydell
2011-10-26 14:59 ` Paolo Bonzini
2011-10-26 15:02 ` Jan Kiszka
2011-10-26 15:09 ` Peter Maydell
2011-10-26 15:13 ` Jan Kiszka
2011-10-26 15:18 ` Peter Maydell
2011-10-26 16:02 ` Jan Kiszka
2011-10-26 16:27 ` Andreas Färber
2011-10-26 16:31 ` Jan Kiszka
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).