Skip to contentSkip to conversation

qemu-kvm.git uq/master queue

GIT PULL In review Marcelo Tosatti 6 participants 24 messages May 12, 2010 – May 20, 2010 KVM

lore
Share & tools
lore
#0 lore raw

The following changes since commit 54d7cf136f040713095cbc064f62d753bff6f9d2:
Markus Armbruster (1):
doc: Clean up monitor command function index

are available in the git repository at:

git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git uq/master

Gleb Natapov (2):
Do not stop VM if emulation failed in userspace.
kvm: fix 80000001.EDX supported bit filtering

Jan Kiszka (2):
kvm: synchronize state from cpu context
kvm: validate context for kvm cpu get/put operations

Marcelo Tosatti (8):
Fix -mem-path with hugetlbfs
kvm: set cpu_single_env around KVM_RUN ioctl
make SIG_IPI to tcg vcpu thread reliable standardize on qemu_cpu_kick for signalling cpu thread(s) port qemu-kvm's on_vcpu code
add cpu_is_stopped helper
move stop/stopped CPU_COMMON fields after area zeroed by reset
kvm: enable smp > 1

 cpu-all.h          |    2 +
 cpu-defs.h         |    6 ++-
 cpu-exec.c         |    7 ++++
 cpus.c             |   88 ++++++++++++++++++++++++++++++++++++++++-----------
 exec-all.h         |    3 ++
 exec.c             |    8 +++-
 kvm-all.c          |   24 ++++++++++---
 kvm.h              |    4 ++
 qemu-common.h      |    8 +++++
 target-i386/kvm.c  |   29 ++++++++++++++++-
 target-ppc/kvm.c   |   10 ++++++
 target-s390x/kvm.c |   10 ++++++
 12 files changed, 169 insertions(+), 30 deletions(-)
#1 lore raw

PATCH 1/12 Fix -mem-path with hugetlbfs

Fallback to qemu_vmalloc in case file_ram_alloc fails.

---
 exec.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)
exec.c +6 -2
index 3416aed..56b5561 100644
@@ -2775,8 +2775,12 @@ ram_addr_t qemu_ram_alloc(ram_addr_t size)
     if (mem_path) {
 #if defined (__linux__) && !defined(TARGET_S390X)
         new_block->host = file_ram_alloc(size, mem_path);
-        if (!new_block->host)
-            exit(1);
+        if (!new_block->host) {
+            new_block->host = qemu_vmalloc(size);
+#ifdef MADV_MERGEABLE
+            madvise(new_block->host, size, MADV_MERGEABLE);
+#endif
+        }
 #else
         fprintf(stderr, "-mem-path option unsupported\n");
         exit(1);
Signature · 1 line
1.6.6.1
#2 lore raw

PATCH 2/12 kvm: set cpu_single_env around KVM_RUN ioctl

In reply to Marcelo Tosatti

Zero cpu_single_env before leaving global lock protection, and restore on return.

---
 kvm-all.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
kvm-all.c +2 -0
index 6962b2b..fbd084c 100644
@@ -838,9 +838,11 @@ int kvm_cpu_exec(CPUState *env)
         }
 
         kvm_arch_pre_run(env, run);
+        cpu_single_env = NULL;
         qemu_mutex_unlock_iothread();
         ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
         qemu_mutex_lock_iothread();
+        cpu_single_env = env;
         kvm_arch_post_run(env, run);
 
         if (ret == -EINTR || ret == -EAGAIN) {
Signature · 1 line
1.6.6.1
#3 lore raw

PATCH 3/12 make SIG_IPI to tcg vcpu thread reliable

In reply to Marcelo Tosatti

Store tcg loop exit request on a global variable, and transfer it to per-CPUState exit_request after assignment of cpu_single_env.

This makes exit request signal from robust. Drop the timedlock hack.

---
 cpu-exec.c |    7 +++++++
 cpus.c     |   23 +++++++++--------------
 exec-all.h |    3 +++
 3 files changed, 19 insertions(+), 14 deletions(-)
cpu-exec.c +7 -0
index dc81e79..c776605 100644
@@ -213,6 +213,8 @@ static void cpu_handle_debug_exception(CPUState *env)
 
 /* main execution loop */
 
+volatile sig_atomic_t exit_request;
+
 int cpu_exec(CPUState *env1)
 {
     volatile host_reg_t saved_env_reg;
@@ -234,6 +236,11 @@ int cpu_exec(CPUState *env1)
     asm("");
     env = env1;
 
+    if (exit_request) {
+        env->exit_request = 1;
+        exit_request = 0;
+    }
+
 #if defined(TARGET_I386)
     if (!kvm_enabled()) {
         /* put eflags in CPU temporary format */
cpus.c +9 -14
index 29462e5..53226b3 100644
@@ -472,6 +472,7 @@ static void cpu_signal(int sig)
 {
     if (cpu_single_env)
         cpu_exit(cpu_single_env);
+    exit_request = 1;
 }
 
 static void tcg_block_io_signals(void)
@@ -542,26 +543,20 @@ static void unblock_io_signals(void)
     pthread_sigmask(SIG_BLOCK, &set, NULL);
 }
 
-static void qemu_signal_lock(unsigned int msecs)
-{
-    qemu_mutex_lock(&qemu_fair_mutex);
-
-    while (qemu_mutex_trylock(&qemu_global_mutex)) {
-        qemu_thread_signal(tcg_cpu_thread, SIG_IPI);
-        if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
-            break;
-    }
-    qemu_mutex_unlock(&qemu_fair_mutex);
-}
-
 void qemu_mutex_lock_iothread(void)
 {
     if (kvm_enabled()) {
         qemu_mutex_lock(&qemu_fair_mutex);
         qemu_mutex_lock(&qemu_global_mutex);
         qemu_mutex_unlock(&qemu_fair_mutex);
-    } else
-        qemu_signal_lock(100);
+    } else {
+        qemu_mutex_lock(&qemu_fair_mutex);
+        if (qemu_mutex_trylock(&qemu_global_mutex)) {
+            qemu_thread_signal(tcg_cpu_thread, SIG_IPI);
+            qemu_mutex_lock(&qemu_global_mutex);
+        }
+        qemu_mutex_unlock(&qemu_fair_mutex);
+    }
 }
 
 void qemu_mutex_unlock_iothread(void)
exec-all.h +3 -0
index 1016de2..4565dd0 100644
@@ -351,4 +351,7 @@ CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler);
 /* vl.c */
 extern int singlestep;
 
+/* cpu-exec.c */
+extern volatile sig_atomic_t exit_request;
+
 #endif
Signature · 1 line
1.6.6.1
#4 lore raw

PATCH 4/12 standardize on qemu_cpu_kick for signalling cpu thread(s)

In reply to Marcelo Tosatti
---
 cpus.c |    7 ++-----
 1 files changed, 2 insertions(+), 5 deletions(-)
cpus.c +2 -5
index 53226b3..5afdb4a 100644
@@ -454,8 +454,7 @@ void qemu_cpu_kick(void *_env)
 {
     CPUState *env = _env;
     qemu_cond_broadcast(env->halt_cond);
-    if (kvm_enabled())
-        qemu_thread_signal(env->thread, SIG_IPI);
+    qemu_thread_signal(env->thread, SIG_IPI);
 }
 
 int qemu_cpu_self(void *_env)
@@ -583,7 +582,6 @@ void pause_all_vcpus(void)
 
     while (penv) {
         penv->stop = 1;
-        qemu_thread_signal(penv->thread, SIG_IPI);
         qemu_cpu_kick(penv);
         penv = (CPUState *)penv->next_cpu;
     }
@@ -592,7 +590,7 @@ void pause_all_vcpus(void)
         qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100);
         penv = first_cpu;
         while (penv) {
-            qemu_thread_signal(penv->thread, SIG_IPI);
+            qemu_cpu_kick(penv);
             penv = (CPUState *)penv->next_cpu;
         }
     }
@@ -605,7 +603,6 @@ void resume_all_vcpus(void)
     while (penv) {
         penv->stop = 0;
         penv->stopped = 0;
-        qemu_thread_signal(penv->thread, SIG_IPI);
         qemu_cpu_kick(penv);
         penv = (CPUState *)penv->next_cpu;
     }
Signature · 1 line
1.6.6.1
#5 lore raw

PATCH 5/12 port qemu-kvm's on_vcpu code

In reply to Marcelo Tosatti

run_on_cpu allows to execute work on a given CPUState context.

---
 cpu-all.h     |    1 +
 cpu-defs.h    |    2 ++
 cpus.c        |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 qemu-common.h |    8 ++++++++
 4 files changed, 64 insertions(+), 0 deletions(-)
cpu-all.h +1 -0
index 52a1817..9efb8a9 100644
@@ -821,6 +821,7 @@ void cpu_watchpoint_remove_all(CPUState *env, int mask);
 
 void cpu_single_step(CPUState *env, int enabled);
 void cpu_reset(CPUState *s);
+void run_on_cpu(CPUState *env, void (*func)(void *data), void *data);
 
 #define CPU_LOG_TB_OUT_ASM (1 << 0)
 #define CPU_LOG_TB_IN_ASM  (1 << 1)
cpu-defs.h +2 -0
index 0140596..c764d67 100644
@@ -132,6 +132,7 @@ typedef struct icount_decr_u16 {
 
 struct kvm_run;
 struct KVMState;
+struct qemu_work_item;
 
 typedef struct CPUBreakpoint {
     target_ulong pc;
@@ -204,6 +205,7 @@ typedef struct CPUWatchpoint {
     uint32_t created;                                                   \
     struct QemuThread *thread;                                          \
     struct QemuCond *halt_cond;                                         \
+    struct qemu_work_item *queued_work_first, *queued_work_last;        \
     const char *cpu_model_str;                                          \
     struct KVMState *kvm_state;                                         \
     struct kvm_run *kvm_run;                                            \
cpus.c +53 -0

83 lines not on this page · raw message

qemu-common.h +8 -0
index 4ba0cda..a4888e5 100644
@@ -249,6 +249,14 @@ void qemu_notify_event(void);
 void qemu_cpu_kick(void *env);
 int qemu_cpu_self(void *env);
 
+/* work queue */
+struct qemu_work_item {
+    struct qemu_work_item *next;
+    void (*func)(void *data);
+    void *data;
+    int done;
+};
+
 #ifdef CONFIG_USER_ONLY
 #define qemu_init_vcpu(env) do { } while (0)
 #else
Signature · 1 line
1.6.6.1
#6 lore raw

PATCH 6/12 kvm: synchronize state from cpu context

In reply to Marcelo Tosatti

From: Jan Kiszka <[email protected]>

It is not safe to retrieve the KVM internal state of a given cpu while its potentially modifying it.

Queue the request to run on cpu context, similarly to qemu-kvm.

---
 kvm-all.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)
kvm-all.c +9 -1
index fbd084c..e766202 100644
@@ -796,14 +796,22 @@ void kvm_flush_coalesced_mmio_buffer(void)
 #endif
 }
 
-void kvm_cpu_synchronize_state(CPUState *env)
+static void do_kvm_cpu_synchronize_state(void *_env)
 {
+    CPUState *env = _env;
+
     if (!env->kvm_vcpu_dirty) {
         kvm_arch_get_registers(env);
         env->kvm_vcpu_dirty = 1;
     }
 }
 
+void kvm_cpu_synchronize_state(CPUState *env)
+{
+    if (!env->kvm_vcpu_dirty)
+        run_on_cpu(env, do_kvm_cpu_synchronize_state, env);
+}
+
 void kvm_cpu_synchronize_post_reset(CPUState *env)
 {
     kvm_arch_put_registers(env, KVM_PUT_RESET_STATE);
Signature · 1 line
1.6.6.1
#7 lore raw

PATCH 7/12 add cpu_is_stopped helper

In reply to Marcelo Tosatti
---
 cpu-all.h |    1 +
 cpus.c    |    5 +++++
 2 files changed, 6 insertions(+), 0 deletions(-)
cpu-all.h +1 -0
index 9efb8a9..47a5722 100644
@@ -821,6 +821,7 @@ void cpu_watchpoint_remove_all(CPUState *env, int mask);
 
 void cpu_single_step(CPUState *env, int enabled);
 void cpu_reset(CPUState *s);
+int cpu_is_stopped(CPUState *env);
 void run_on_cpu(CPUState *env, void (*func)(void *data), void *data);
 
 #define CPU_LOG_TB_OUT_ASM (1 << 0)
cpus.c +5 -0
index af87007..826886c 100644
@@ -91,6 +91,11 @@ void cpu_synchronize_all_post_init(void)
     }
 }
 
+int cpu_is_stopped(CPUState *env)
+{
+    return !vm_running || env->stopped;
+}
+
 static void do_vm_stop(int reason)
 {
     if (vm_running) {
Signature · 1 line
1.6.6.1
#8 lore raw

PATCH 8/12 move stop/stopped CPU_COMMON fields after area zeroed by reset

In reply to Marcelo Tosatti

cpu_reset zeroes CPUState upto breakpoints member. Contents of stop/stopped should not be zeroed on cpu_reset.

---
 cpu-defs.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
cpu-defs.h +2 -2
index c764d67..8d4bf86 100644
@@ -159,8 +159,6 @@ typedef struct CPUWatchpoint {
     target_ulong mem_io_vaddr; /* target virtual addr at which the      \
                                      memory was accessed */             \
     uint32_t halted; /* Nonzero if the CPU is in suspend state */       \
-    uint32_t stop;   /* Stop request */                                 \
-    uint32_t stopped; /* Artificially stopped */                        \
     uint32_t interrupt_request;                                         \
     volatile sig_atomic_t exit_request;                                 \
     CPU_COMMON_TLB                                                      \
@@ -203,6 +201,8 @@ typedef struct CPUWatchpoint {
     void *opaque;                                                       \
                                                                         \
     uint32_t created;                                                   \
+    uint32_t stop;   /* Stop request */                                 \
+    uint32_t stopped; /* Artificially stopped */                        \
     struct QemuThread *thread;                                          \
     struct QemuCond *halt_cond;                                         \
     struct qemu_work_item *queued_work_first, *queued_work_last;        \
Signature · 1 line
1.6.6.1
#9 lore raw

PATCH 9/12 kvm: validate context for kvm cpu get/put operations

In reply to Marcelo Tosatti

From: Jan Kiszka <[email protected]>

Validate that KVM vcpu state is only read/written from cpu thread itself or that cpu is stopped.

---
 target-i386/kvm.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
target-i386/kvm.c +4 -0
index f73b47b..c9ec72e 100644
@@ -949,6 +949,8 @@ int kvm_arch_put_registers(CPUState *env, int level)
 {
     int ret;
 
+    assert(cpu_is_stopped(env) || qemu_cpu_self(env));
+
     ret = kvm_getput_regs(env, 1);
     if (ret < 0)
         return ret;
@@ -991,6 +993,8 @@ int kvm_arch_get_registers(CPUState *env)
 {
     int ret;
 
+    assert(cpu_is_stopped(env) || qemu_cpu_self(env));
+
     ret = kvm_getput_regs(env, 0);
     if (ret < 0)
         return ret;
Signature · 1 line
1.6.6.1
#10 lore raw

PATCH 10/12 kvm: enable smp > 1

In reply to Marcelo Tosatti

Process INIT/SIPI requests and enable -smp > 1.

---
 kvm-all.c          |   10 +++++-----
 kvm.h              |    2 ++
 target-i386/kvm.c  |   16 ++++++++++++++++
 target-ppc/kvm.c   |    5 +++++
 target-s390x/kvm.c |    5 +++++
 5 files changed, 33 insertions(+), 5 deletions(-)
kvm-all.c +5 -5
index e766202..d06980c 100644
@@ -593,11 +593,6 @@ int kvm_init(int smp_cpus)
     int ret;
     int i;
 
-    if (smp_cpus > 1) {
-        fprintf(stderr, "No SMP KVM support, use '-smp 1'\n");
-        return -EINVAL;
-    }
-
     s = qemu_mallocz(sizeof(KVMState));
 
 #ifdef KVM_CAP_SET_GUEST_DEBUG
@@ -840,6 +835,11 @@ int kvm_cpu_exec(CPUState *env)
         }
 #endif
 
+        if (kvm_arch_process_irqchip_events(env)) {
+            ret = 0;
+            break;
+        }
+
         if (env->kvm_vcpu_dirty) {
             kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
             env->kvm_vcpu_dirty = 0;
kvm.h +2 -0
index 70bfbf8..5071a31 100644
@@ -90,6 +90,8 @@ int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run);
 
 int kvm_arch_pre_run(CPUState *env, struct kvm_run *run);
 
+int kvm_arch_process_irqchip_events(CPUState *env);
+
 int kvm_arch_get_registers(CPUState *env);
 
 /* state subset only touched by the VCPU itself during runtime */
target-i386/kvm.c +16 -0
index c9ec72e..bd7a190 100644
@@ -1073,6 +1073,22 @@ int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
     return 0;
 }
 
+int kvm_arch_process_irqchip_events(CPUState *env)
+{
+    if (env->interrupt_request & CPU_INTERRUPT_INIT) {
+        kvm_cpu_synchronize_state(env);
+        do_cpu_init(env);
+        env->exception_index = EXCP_HALTED;
+    }
+
+    if (env->interrupt_request & CPU_INTERRUPT_SIPI) {
+        kvm_cpu_synchronize_state(env);
+        do_cpu_sipi(env);
+    }
+
+    return env->halted;
+}
+
 static int kvm_handle_halt(CPUState *env)
 {
     if (!((env->interrupt_request & CPU_INTERRUPT_HARD) &&
target-ppc/kvm.c +5 -0
index aa3d432..91c0963 100644
@@ -224,6 +224,11 @@ int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
     return 0;
 }
 
+int kvm_arch_process_irqchip_events(CPUState *env)
+{
+    return 0;
+}
+
 static int kvmppc_handle_halt(CPUState *env)
 {
     if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
target-s390x/kvm.c +5 -0
index 72e77b0..a2c00ac 100644
@@ -175,6 +175,11 @@ int kvm_arch_post_run(CPUState *env, struct kvm_run *run)
     return 0;
 }
 
+int kvm_arch_process_irqchip_events(CPUState *env)
+{
+    return 0;
+}
+
 static void kvm_s390_interrupt_internal(CPUState *env, int type, uint32_t parm,
                                         uint64_t parm64, int vm)
 {
Signature · 1 line
1.6.6.1
#11 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 1 line · Marcelo Tosatti

Process INIT/SIPI requests and enable -smp > 1.

Does this enable real SMP or does it still only allow one vcpu to run at a time?

Alex

#12 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 8 lines · Alexander Graf
Quoted 2 lines · Marcelo Tosatti

Process INIT/SIPI requests and enable -smp> 1.

Does this enable real SMP or does it still only allow one vcpu to run at a time?

The realest ever. Still doesn't use in-kernel irqchip (qemu-kvm does "real" smp with -no-kvm-irqchip as well).

Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
#13 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 11 lines · Avi Kivity
Quoted 8 lines · Alexander Graf
Quoted 2 lines · Marcelo Tosatti

Process INIT/SIPI requests and enable -smp> 1.

Does this enable real SMP or does it still only allow one vcpu to run at a time?

The realest ever. Still doesn't use in-kernel irqchip (qemu-kvm does "real" smp with -no-kvm-irqchip as well).

That's odd. On S390 I only get at most 100% cpu usage no matter how much -smp I pass.

Alex

#14 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 6 lines · Alexander Graf
Quoted 4 lines · Avi Kivity
Quoted 3 lines · Alexander Graf

On 12.05.2010, at 23:25, Marcelo Tosatti wrote:

Quoted 8 lines
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines

Process INIT/SIPI requests and enable -smp> 1.

Does this enable real SMP or does it still only allow one vcpu to run at a time?

The realest ever. Still doesn't use in-kernel irqchip (qemu-kvm does "real" smp with -no-kvm-irqchip as well).

That's odd. On S390 I only get at most 100% cpu usage no matter how much -smp I pass.

--enable-io-thread?

If you had it disabled, it would also answer my question if -smp works without problems without that feature.

Jan

Signature · 2 lines
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
#15 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 12 lines · Jan Kiszka
Quoted 11 lines · Alexander Graf
Quoted 9 lines · Avi Kivity
Quoted 8 lines · Alexander Graf
Quoted 2 lines · Marcelo Tosatti

Process INIT/SIPI requests and enable -smp> 1.

Does this enable real SMP or does it still only allow one vcpu to run at a time?

Quoted 8 lines
Quoted 3 lines
Quoted 1 line

The realest ever. Still doesn't use in-kernel irqchip (qemu-kvm does "real" smp with -no-kvm-irqchip as well).

That's odd. On S390 I only get at most 100% cpu usage no matter how much -smp I pass.

--enable-io-thread?

If you had it disabled, it would also answer my question if -smp works without problems without that feature.

Ah, yes, that's different.

And with --enable-io-thread I finally also get the virtio-console hang again! Yay!

Alex

#16 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

In reply to Jan Kiszka
Quoted 9 lines · Jan Kiszka

...
--enable-io-thread?

If you had it disabled, it would also answer my question if -smp works without problems without that feature.

Jan

Hi,
i have a dumb question: what is the "--enable-io-thread"? Is this a kvm-switch?
My kvm 0.12.4 don't accept this switch. I'm know only "threads=n" as smp-parameter and "aio=threads" as drive-parameter.

Because i look for a solution for a better io-performance of windows-guest with more than one cpu...

best regards

Udo

#17 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 11 lines · Udo Lembke
Quoted 8 lines · Jan Kiszka

...
--enable-io-thread?

If you had it disabled, it would also answer my question if -smp works without problems without that feature.

Jan

Hi,
i have a dumb question: what is the "--enable-io-thread"? Is this a kvm-switch?

It's a ./configure switch for upstream qemu (don't use with qemu-kvm yet).

Quoted 3 lines

My kvm 0.12.4 don't accept this switch. I'm know only "threads=n" as smp-parameter and "aio=threads" as drive-parameter.

Because i look for a solution for a better io-performance of windows-guest with more than one cpu...

Unrelated, what are your smp issues?

Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
#18 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 13 lines · Avi Kivity
Quoted 11 lines · Udo Lembke
Quoted 8 lines · Jan Kiszka

...
--enable-io-thread?

If you had it disabled, it would also answer my question if -smp works without problems without that feature.

Jan

Hi,
i have a dumb question: what is the "--enable-io-thread"? Is this a kvm-switch?

Quoted 8 lines

It's a ./configure switch for upstream qemu (don't use with qemu-kvm yet).

Quoted 3 lines

My kvm 0.12.4 don't accept this switch. I'm know only "threads=n" as smp-parameter and "aio=threads" as drive-parameter.

Because i look for a solution for a better io-performance of windows-guest with more than one cpu...

Unrelated, what are your smp issues?

If i use one cpu i got a good io-performance:
e.g. over 500MB/s at the profile "install" of the io-benchmark h2benchw.exe.
( aio=threads | SAS-Raid-0 | ftp://ftp.heise.de/pub/ct/ctsi/h2benchw.zip | hwbenchw.exe -p -w iotest 0) The same test but with two cpus gives results between 27 and 298 MB/s!

Also in real life it's noticeable not only with an benchmark. I use a win-vm with two cpu for postscript-ripping and have a performance drop due to the bad io.

Udo

#19 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 9 lines · Udo Lembke
Quoted 2 lines

Unrelated, what are your smp issues?

If i use one cpu i got a good io-performance:
e.g. over 500MB/s at the profile "install" of the io-benchmark h2benchw.exe.
( aio=threads | SAS-Raid-0 | ftp://ftp.heise.de/pub/ct/ctsi/h2benchw.zip | hwbenchw.exe -p -w iotest 0) The same test but with two cpus gives results between 27 and 298 MB/s!

Also in real life it's noticeable not only with an benchmark. I use a win-vm with two cpu for postscript-ripping and have a performance drop due to the bad io.

What's your block device model? virtio or ide?

What does cpu usage look like on guest or host?

Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
#20 lore raw

Re: [PATCH 10/12] kvm: enable smp > 1

Quoted 11 lines · Avi Kivity
Quoted 9 lines · Udo Lembke
Quoted 2 lines

Unrelated, what are your smp issues?

If i use one cpu i got a good io-performance:
e.g. over 500MB/s at the profile "install" of the io-benchmark h2benchw.exe.
( aio=threads | SAS-Raid-0 | ftp://ftp.heise.de/pub/ct/ctsi/h2benchw.zip | hwbenchw.exe -p -w iotest 0) The same test but with two cpus gives results between 27 and 298 MB/s!

Also in real life it's noticeable not only with an benchmark. I use a win-vm with two cpu for postscript-ripping and have a performance drop due to the bad io.

Hi,

Quoted 1 line

What's your block device model? virtio or ide?

in the test described before i used virtio, but the same happens with ide (but of course slightly different values).

Quoted 2 lines

What does cpu usage look like on guest or host?

On the guest it's looks like the io-process flap between the cpus. Windows show both cpus together are around 65% (less or more) , but if one CPU-usage rise, the other drop. On the host:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5386 root 20 0 1160m 1.0g 1552 R 109 13.5 1:23.58 kvm

The guest is a win-xp, but the same happens in real life on a win2003.

Udo

#21 lore raw

PATCH 11/12 Do not stop VM if emulation failed in userspace.

In reply to Marcelo Tosatti

From: Gleb Natapov <[email protected]>

Continue vcpu execution in case emulation failure happened while vcpu was in userspace. In this case #UD will be injected into the guest allowing guest OS to kill offending process and continue.

---
 kvm-all.c          |    2 ++
 kvm.h              |    2 ++
 target-i386/kvm.c  |    7 +++++++
 target-ppc/kvm.c   |    5 +++++
 target-s390x/kvm.c |    5 +++++
 5 files changed, 21 insertions(+), 0 deletions(-)
kvm-all.c +2 -0
index d06980c..c238f54 100644
@@ -764,6 +764,8 @@ static void kvm_handle_internal_error(CPUState *env, struct kvm_run *run)
     cpu_dump_state(env, stderr, fprintf, 0);
     if (run->internal.suberror == KVM_INTERNAL_ERROR_EMULATION) {
         fprintf(stderr, "emulation failure\n");
+        if (!kvm_arch_stop_on_emulation_error(env))
+		return;
     }
     /* FIXME: Should trigger a qmp message to let management know
      * something went wrong.
kvm.h +2 -0
index 5071a31..a28e7aa 100644
@@ -140,6 +140,8 @@ void kvm_arch_remove_all_hw_breakpoints(void);
 
 void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg);
 
+bool kvm_arch_stop_on_emulation_error(CPUState *env);
+
 int kvm_check_extension(KVMState *s, unsigned int extension);
 
 uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
target-i386/kvm.c +7 -0
index bd7a190..676aa60 100644
@@ -1289,3 +1289,10 @@ void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg)
     }
 }
 #endif /* KVM_CAP_SET_GUEST_DEBUG */
+
+bool kvm_arch_stop_on_emulation_error(CPUState *env)
+{
+      return !(env->cr[0] & CR0_PE_MASK) ||
+              ((env->segs[R_CS].selector  & 3) != 3);
+}
+
target-ppc/kvm.c +5 -0
index 91c0963..2625cb8 100644
@@ -326,3 +326,8 @@ uint32_t kvmppc_get_tbfreq(void)
     retval = atoi(ns);
     return retval;
 }
+
+bool kvm_arch_stop_on_emulation_error(CPUState *env)
+{
+    return true;
+}
target-s390x/kvm.c +5 -0
index a2c00ac..a2d7741 100644
@@ -485,3 +485,8 @@ int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
 
     return ret;
 }
+
+bool kvm_arch_stop_on_emulation_error(CPUState *env)
+{
+    return true;
+}
Signature · 1 line
1.6.6.1
#22 lore raw

PATCH 12/12 kvm: fix 80000001.EDX supported bit filtering

In reply to Marcelo Tosatti

From: Gleb Natapov <[email protected]>

On AMD some bits from 1.EDX are reported in 80000001.EDX. The mask used to copy bits from 1.EDX to 80000001.EDX is incorrect resulting in unsupported features passed into a guest.

---
 target-i386/kvm.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
target-i386/kvm.c +1 -1
index 676aa60..d6b12ed 100644
@@ -111,7 +111,7 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)
                      * so add missing bits according to the AMD spec:
                      */
                     cpuid_1_edx = kvm_arch_get_supported_cpuid(env, 1, R_EDX);
-                    ret |= cpuid_1_edx & 0xdfeff7ff;
+                    ret |= cpuid_1_edx & 0x183f7ff;
                     break;
                 }
                 break;
Signature · 1 line
1.6.6.1
#23 lore raw
In reply to Marcelo Tosatti
Quoted 4 lines · Marcelo Tosatti

The following changes since commit 54d7cf136f040713095cbc064f62d753bff6f9d2:
Markus Armbruster (1):
doc: Clean up monitor command function index

Pulled. Thanks.

Regards,

Anthony Liguori

Quoted 38 lines

are available in the git repository at:

git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git uq/master

Gleb Natapov (2):
Do not stop VM if emulation failed in userspace.
kvm: fix 80000001.EDX supported bit filtering

Jan Kiszka (2):
kvm: synchronize state from cpu context
kvm: validate context for kvm cpu get/put operations

Marcelo Tosatti (8):
Fix -mem-path with hugetlbfs
kvm: set cpu_single_env around KVM_RUN ioctl
make SIG_IPI to tcg vcpu thread reliable standardize on qemu_cpu_kick for signalling cpu thread(s) port qemu-kvm's on_vcpu code
add cpu_is_stopped helper
move stop/stopped CPU_COMMON fields after area zeroed by reset
kvm: enable smp> 1

  cpu-all.h          |    2 +
  cpu-defs.h         |    6 ++-
  cpu-exec.c         |    7 ++++
  cpus.c             |   88 ++++++++++++++++++++++++++++++++++++++++-----------
  exec-all.h         |    3 ++
  exec.c             |    8 +++-
  kvm-all.c          |   24 ++++++++++---
  kvm.h              |    4 ++
  qemu-common.h      |    8 +++++
  target-i386/kvm.c  |   29 ++++++++++++++++-
  target-ppc/kvm.c   |   10 ++++++
  target-s390x/kvm.c |   10 ++++++
  12 files changed, 169 insertions(+), 30 deletions(-)