public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [patch 0/4] fix SMP migration and savevm/loadvm
@ 2008-04-05 18:22 Marcelo Tosatti
  2008-04-05 18:22 ` [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running Marcelo Tosatti
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-05 18:22 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm-devel


-- 


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running
  2008-04-05 18:22 [patch 0/4] fix SMP migration and savevm/loadvm Marcelo Tosatti
@ 2008-04-05 18:22 ` Marcelo Tosatti
  2008-04-06  9:09   ` Avi Kivity
  2008-04-05 18:22 ` [patch 2/4] QEMU/KVM: save and load mp state Marcelo Tosatti
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-05 18:22 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm-devel, Marcelo Tosatti

[-- Attachment #1: fix-migration-1 --]
[-- Type: text/plain, Size: 1206 bytes --]

In the -incoming case the apic regs are not initialized and therefore
bogus.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm-userspace.io/qemu/qemu-kvm-x86.c
===================================================================
--- kvm-userspace.io.orig/qemu/qemu-kvm-x86.c
+++ kvm-userspace.io/qemu/qemu-kvm-x86.c
@@ -27,6 +27,8 @@ static int kvm_has_msr_star;
 
 static int lm_capable_kernel;
 
+extern int vm_running;
+
 int kvm_arch_qemu_create_context(void)
 {
     int i;
@@ -248,7 +250,7 @@ void kvm_arch_load_regs(CPUState *env)
     sregs.cr3 = env->cr[3];
     sregs.cr4 = env->cr[4];
 
-    if (kvm_irqchip_in_kernel(kvm_context)) {
+    if (kvm_irqchip_in_kernel(kvm_context) && vm_running) {
         sregs.cr8 = kvm_get_cr8(kvm_context, env->cpu_index);
         sregs.apic_base = kvm_get_apic_base(kvm_context, env->cpu_index);
     } else {

-- 


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [patch 2/4] QEMU/KVM: save and load mp state
  2008-04-05 18:22 [patch 0/4] fix SMP migration and savevm/loadvm Marcelo Tosatti
  2008-04-05 18:22 ` [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running Marcelo Tosatti
@ 2008-04-05 18:22 ` Marcelo Tosatti
  2008-04-06  9:13   ` Avi Kivity
  2008-04-05 18:22 ` [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace Marcelo Tosatti
  2008-04-05 18:22 ` [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel Marcelo Tosatti
  3 siblings, 1 reply; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-05 18:22 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm-devel, Marcelo Tosatti

[-- Attachment #1: fix-smp-migration --]
[-- Type: text/plain, Size: 4459 bytes --]

Use the new ioctl's to save and restore the MP_STATE for all vcpu's.

Fixes SMP migration.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm-userspace.io/libkvm/libkvm.c
===================================================================
--- kvm-userspace.io.orig/libkvm/libkvm.c
+++ kvm-userspace.io/libkvm/libkvm.c
@@ -776,6 +776,17 @@ int kvm_set_sregs(kvm_context_t kvm, int
     return ioctl(kvm->vcpu_fd[vcpu], KVM_SET_SREGS, sregs);
 }
 
+int kvm_get_mpstate(kvm_context_t kvm, int vcpu, int *mpstate)
+{
+    return ioctl(kvm->vcpu_fd[vcpu], KVM_GET_MP_STATE, mpstate);
+}
+
+int kvm_set_mpstate(kvm_context_t kvm, int vcpu, int *mpstate)
+{
+    return ioctl(kvm->vcpu_fd[vcpu], KVM_SET_MP_STATE, mpstate);
+}
+
+
 static int handle_mmio(kvm_context_t kvm, struct kvm_run *kvm_run)
 {
 	unsigned long addr = kvm_run->mmio.phys_addr;
Index: kvm-userspace.io/libkvm/libkvm.h
===================================================================
--- kvm-userspace.io.orig/libkvm/libkvm.h
+++ kvm-userspace.io/libkvm/libkvm.h
@@ -301,6 +301,18 @@ int kvm_get_sregs(kvm_context_t kvm, int
 int kvm_set_sregs(kvm_context_t kvm, int vcpu, struct kvm_sregs *regs);
 
 /*!
+ *  * \brief Read VCPU MP state
+ *
+ */
+int kvm_get_mpstate(kvm_context_t kvm, int vcpu, int *mpstate);
+
+/*!
+ *  * \brief Write VCPU MP state
+ *
+ */
+int kvm_set_mpstate(kvm_context_t kvm, int vcpu, int *mpstate);
+
+/*!
  * \brief Simulate an external vectored interrupt
  *
  * This allows you to simulate an external vectored interrupt.
Index: kvm-userspace.io/qemu/qemu-kvm-x86.c
===================================================================
--- kvm-userspace.io.orig/qemu/qemu-kvm-x86.c
+++ kvm-userspace.io/qemu/qemu-kvm-x86.c
@@ -282,6 +282,15 @@ void kvm_arch_load_regs(CPUState *env)
         perror("kvm_set_msrs FAILED");
 }
 
+void kvm_save_mpstate(CPUState *env)
+{
+    kvm_get_mpstate(kvm_context, env->cpu_index, &env->mp_state);
+}
+
+void kvm_load_mpstate(CPUState *env)
+{
+    kvm_set_mpstate(kvm_context, env->cpu_index, &env->mp_state);
+}
 
 void kvm_arch_save_regs(CPUState *env)
 {
Index: kvm-userspace.io/qemu/qemu-kvm.h
===================================================================
--- kvm-userspace.io.orig/qemu/qemu-kvm.h
+++ kvm-userspace.io/qemu/qemu-kvm.h
@@ -18,6 +18,8 @@ int kvm_init_ap(void);
 void kvm_qemu_destroy(void);
 void kvm_load_registers(CPUState *env);
 void kvm_save_registers(CPUState *env);
+void kvm_load_mpstate(CPUState *env);
+void kvm_save_mpstate(CPUState *env);
 int kvm_cpu_exec(CPUState *env);
 int kvm_update_debugger(CPUState *env);
 int kvm_qemu_init_env(CPUState *env);
Index: kvm-userspace.io/qemu/target-i386/cpu.h
===================================================================
--- kvm-userspace.io.orig/qemu/target-i386/cpu.h
+++ kvm-userspace.io/qemu/target-i386/cpu.h
@@ -599,6 +599,7 @@ typedef struct CPUX86State {
     /* in order to simplify APIC support, we leave this pointer to the
        user */
     struct APICState *apic_state;
+    int mp_state;
 } CPUX86State;
 
 CPUX86State *cpu_x86_init(const char *cpu_model);
Index: kvm-userspace.io/qemu/vl.c
===================================================================
--- kvm-userspace.io.orig/qemu/vl.c
+++ kvm-userspace.io/qemu/vl.c
@@ -6655,8 +6655,10 @@ void cpu_save(QEMUFile *f, void *opaque)
     uint32_t hflags;
     int i;
 
-    if (kvm_enabled())
+    if (kvm_enabled()) {
         kvm_save_registers(env);
+        kvm_save_mpstate(env);
+    }
 
     for(i = 0; i < CPU_NB_REGS; i++)
         qemu_put_betls(f, &env->regs[i]);
@@ -6748,6 +6750,7 @@ void cpu_save(QEMUFile *f, void *opaque)
             qemu_put_be32s(f, &env->kvm_interrupt_bitmap[i]);
         }
         qemu_put_be64s(f, &env->tsc);
+        qemu_put_be32s(f, &env->mp_state);
     }
 }
 
@@ -6899,7 +6902,9 @@ int cpu_load(QEMUFile *f, void *opaque, 
             qemu_get_be32s(f, &env->kvm_interrupt_bitmap[i]);
         }
         qemu_get_be64s(f, &env->tsc);
+        qemu_get_be32s(f, &env->mp_state);
         kvm_load_registers(env);
+        kvm_load_mpstate(env);
     }
     return 0;
 }

-- 


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace
  2008-04-05 18:22 [patch 0/4] fix SMP migration and savevm/loadvm Marcelo Tosatti
  2008-04-05 18:22 ` [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running Marcelo Tosatti
  2008-04-05 18:22 ` [patch 2/4] QEMU/KVM: save and load mp state Marcelo Tosatti
@ 2008-04-05 18:22 ` Marcelo Tosatti
  2008-04-06  9:15   ` Avi Kivity
  2008-04-05 18:22 ` [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel Marcelo Tosatti
  3 siblings, 1 reply; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-05 18:22 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm-devel, Marcelo Tosatti

[-- Attachment #1: ignore-sipi --]
[-- Type: text/plain, Size: 1002 bytes --]

Otherwise a signal can be received in userspace and a vcpu goes back
to the kernel while it should stay still.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm-userspace.io/qemu/qemu-kvm.c
===================================================================
--- kvm-userspace.io.orig/qemu/qemu-kvm.c
+++ kvm-userspace.io/qemu/qemu-kvm.c
@@ -350,7 +350,6 @@ static void *ap_main_loop(void *_env)
     vcpu->env = env;
     vcpu->env->thread_id = kvm_get_thread_id();
     sigfillset(&signals);
-    sigdelset(&signals, SIG_IPI);
     sigprocmask(SIG_BLOCK, &signals, NULL);
     kvm_create_vcpu(kvm_context, env->cpu_index);
     kvm_qemu_init_env(env);

-- 


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel
  2008-04-05 18:22 [patch 0/4] fix SMP migration and savevm/loadvm Marcelo Tosatti
                   ` (2 preceding siblings ...)
  2008-04-05 18:22 ` [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace Marcelo Tosatti
@ 2008-04-05 18:22 ` Marcelo Tosatti
  2008-04-06  9:18   ` Avi Kivity
  3 siblings, 1 reply; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-05 18:22 UTC (permalink / raw)
  To: Avi Kivity, Anthony Liguori; +Cc: kvm-devel, Marcelo Tosatti

[-- Attachment #1: apic-save --]
[-- Type: text/plain, Size: 1226 bytes --]

Fixes loadvm/savem on SMP.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm-userspace.io/qemu/hw/apic.c
===================================================================
--- kvm-userspace.io.orig/qemu/hw/apic.c
+++ kvm-userspace.io/qemu/hw/apic.c
@@ -248,8 +248,11 @@ void cpu_set_apic_base(CPUState *env, ui
 #ifdef DEBUG_APIC
     printf("cpu_set_apic_base: %016" PRIx64 "\n", val);
 #endif
-    s->apicbase = (val & 0xfffff000) |
-        (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
+    if (kvm_enabled() && qemu_kvm_irqchip_in_kernel())
+        s->apicbase = val;
+    else
+        s->apicbase = (val & 0xfffff000) |
+            (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
     /* if disabled, cannot be enabled again */
     if (!(val & MSR_IA32_APICBASE_ENABLE)) {
         s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;

-- 


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running
  2008-04-05 18:22 ` [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running Marcelo Tosatti
@ 2008-04-06  9:09   ` Avi Kivity
  0 siblings, 0 replies; 12+ messages in thread
From: Avi Kivity @ 2008-04-06  9:09 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm-devel

Marcelo Tosatti wrote:
> In the -incoming case the apic regs are not initialized and therefore
> bogus.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> Index: kvm-userspace.io/qemu/qemu-kvm-x86.c
> ===================================================================
> --- kvm-userspace.io.orig/qemu/qemu-kvm-x86.c
> +++ kvm-userspace.io/qemu/qemu-kvm-x86.c
> @@ -27,6 +27,8 @@ static int kvm_has_msr_star;
>  
>  static int lm_capable_kernel;
>  
> +extern int vm_running;
> +
>  int kvm_arch_qemu_create_context(void)
>  {
>      int i;
> @@ -248,7 +250,7 @@ void kvm_arch_load_regs(CPUState *env)
>      sregs.cr3 = env->cr[3];
>      sregs.cr4 = env->cr[4];
>  
> -    if (kvm_irqchip_in_kernel(kvm_context)) {
> +    if (kvm_irqchip_in_kernel(kvm_context) && vm_running) {
>          sregs.cr8 = kvm_get_cr8(kvm_context, env->cpu_index);
>          sregs.apic_base = kvm_get_apic_base(kvm_context, env->cpu_index);
>      } else {
>   

Fishy.   What if the vm is stopped using the monitor?

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 2/4] QEMU/KVM: save and load mp state
  2008-04-05 18:22 ` [patch 2/4] QEMU/KVM: save and load mp state Marcelo Tosatti
@ 2008-04-06  9:13   ` Avi Kivity
  0 siblings, 0 replies; 12+ messages in thread
From: Avi Kivity @ 2008-04-06  9:13 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm-devel

Marcelo Tosatti wrote:
> Use the new ioctl's to save and restore the MP_STATE for all vcpu's.
>
> Fixes SMP migration.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> Index: kvm-userspace.io/libkvm/libkvm.c
> ===================================================================
> --- kvm-userspace.io.orig/libkvm/libkvm.c
> +++ kvm-userspace.io/libkvm/libkvm.c
> @@ -776,6 +776,17 @@ int kvm_set_sregs(kvm_context_t kvm, int
>      return ioctl(kvm->vcpu_fd[vcpu], KVM_SET_SREGS, sregs);
>  }
>  
> +int kvm_get_mpstate(kvm_context_t kvm, int vcpu, int *mpstate)
> +{
> +    return ioctl(kvm->vcpu_fd[vcpu], KVM_GET_MP_STATE, mpstate);
> +}
> +
> +int kvm_set_mpstate(kvm_context_t kvm, int vcpu, int *mpstate)
> +{
> +    return ioctl(kvm->vcpu_fd[vcpu], KVM_SET_MP_STATE, mpstate);
> +}
> +
>   

I missed the kernel part of this.  The functions need KVM_CAP 
compile-time and run-time protection.  Please separate the libkvm and 
qemu parts.

>  
>  CPUX86State *cpu_x86_init(const char *cpu_model);
> Index: kvm-userspace.io/qemu/vl.c
> ===================================================================
> --- kvm-userspace.io.orig/qemu/vl.c
> +++ kvm-userspace.io/qemu/vl.c
> @@ -6655,8 +6655,10 @@ void cpu_save(QEMUFile *f, void *opaque)
>      uint32_t hflags;
>      int i;
>  
> -    if (kvm_enabled())
> +    if (kvm_enabled()) {
>          kvm_save_registers(env);
> +        kvm_save_mpstate(env);
> +    }
>   

Perhaps fold kvm_save_mpstate() into kvm_save_registers()?  We can 
regard the mp state as a hidden register.

>  
>      for(i = 0; i < CPU_NB_REGS; i++)
>          qemu_put_betls(f, &env->regs[i]);
> @@ -6748,6 +6750,7 @@ void cpu_save(QEMUFile *f, void *opaque)
>              qemu_put_be32s(f, &env->kvm_interrupt_bitmap[i]);
>          }
>          qemu_put_be64s(f, &env->tsc);
> +        qemu_put_be32s(f, &env->mp_state);
>      }
>  }
>  

Bump the format version number and introduce compatibility code, please.


-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace
  2008-04-05 18:22 ` [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace Marcelo Tosatti
@ 2008-04-06  9:15   ` Avi Kivity
  2008-04-07 20:26     ` Marcelo Tosatti
  0 siblings, 1 reply; 12+ messages in thread
From: Avi Kivity @ 2008-04-06  9:15 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm-devel

Marcelo Tosatti wrote:
> Otherwise a signal can be received in userspace and a vcpu goes back
> to the kernel while it should stay still.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> Index: kvm-userspace.io/qemu/qemu-kvm.c
> ===================================================================
> --- kvm-userspace.io.orig/qemu/qemu-kvm.c
> +++ kvm-userspace.io/qemu/qemu-kvm.c
> @@ -350,7 +350,6 @@ static void *ap_main_loop(void *_env)
>      vcpu->env = env;
>      vcpu->env->thread_id = kvm_get_thread_id();
>      sigfillset(&signals);
> -    sigdelset(&signals, SIG_IPI);
>      sigprocmask(SIG_BLOCK, &signals, NULL);
>      kvm_create_vcpu(kvm_context, env->cpu_index);
>      kvm_qemu_init_env(env);
>
>   

Does this work with -no-kvm-irqchip?

I think we need to fix the kernel to handle random signals.  Otherwise 
even attaching a debugger can change guest behavior (I think).

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel
  2008-04-05 18:22 ` [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel Marcelo Tosatti
@ 2008-04-06  9:18   ` Avi Kivity
  2008-04-07 17:35     ` Marcelo Tosatti
  0 siblings, 1 reply; 12+ messages in thread
From: Avi Kivity @ 2008-04-06  9:18 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm-devel

Marcelo Tosatti wrote:
> Fixes loadvm/savem on SMP.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> Index: kvm-userspace.io/qemu/hw/apic.c
> ===================================================================
> --- kvm-userspace.io.orig/qemu/hw/apic.c
> +++ kvm-userspace.io/qemu/hw/apic.c
> @@ -248,8 +248,11 @@ void cpu_set_apic_base(CPUState *env, ui
>  #ifdef DEBUG_APIC
>      printf("cpu_set_apic_base: %016" PRIx64 "\n", val);
>  #endif
> -    s->apicbase = (val & 0xfffff000) |
> -        (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
> +    if (kvm_enabled() && qemu_kvm_irqchip_in_kernel())
> +        s->apicbase = val;
> +    else
> +        s->apicbase = (val & 0xfffff000) |
> +            (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
>      /* if disabled, cannot be enabled again */
>      if (!(val & MSR_IA32_APICBASE_ENABLE)) {
>          s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;
>
>   

Can you explain how the existing code fails?

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel
  2008-04-06  9:18   ` Avi Kivity
@ 2008-04-07 17:35     ` Marcelo Tosatti
  0 siblings, 0 replies; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-07 17:35 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm-devel

On Sun, Apr 06, 2008 at 12:18:20PM +0300, Avi Kivity wrote:
> Marcelo Tosatti wrote:
> >Fixes loadvm/savem on SMP.
> >
> >Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
> >
> >Index: kvm-userspace.io/qemu/hw/apic.c
> >===================================================================
> >--- kvm-userspace.io.orig/qemu/hw/apic.c
> >+++ kvm-userspace.io/qemu/hw/apic.c
> >@@ -248,8 +248,11 @@ void cpu_set_apic_base(CPUState *env, ui
> > #ifdef DEBUG_APIC
> >     printf("cpu_set_apic_base: %016" PRIx64 "\n", val);
> > #endif
> >-    s->apicbase = (val & 0xfffff000) |
> >-        (s->apicbase & (MSR_IA32_APICBASE_BSP | 
> >MSR_IA32_APICBASE_ENABLE));
> >+    if (kvm_enabled() && qemu_kvm_irqchip_in_kernel())
> >+        s->apicbase = val;
> >+    else
> >+        s->apicbase = (val & 0xfffff000) |
> >+            (s->apicbase & (MSR_IA32_APICBASE_BSP | 
> >MSR_IA32_APICBASE_ENABLE));
> >     /* if disabled, cannot be enabled again */
> >     if (!(val & MSR_IA32_APICBASE_ENABLE)) {
> >         s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;
> >
> >  
> 
> Can you explain how the existing code fails?

It fails because apic_load (qemu/hw/apic.c), which runs
after cpu_load, will set the apic base value saved by
QEMU. And for some reason cpu_set_apic_base() uses the
MSR_IA32_APICBASE_BSP/MSR_IA32_APICBASE_ENABLE bits from s->apicbase
instead of what the caller passed. That breaks if in-kernel APIC
emulation is being used.

So this is the same bug which caused vmport to disable the APIC 
for SMP guests on X11.

I think it is better to revert that partial fix and instead make sure
that cpu_get_apic_base() will return the proper value.

This also fixes
https://sourceforge.net/tracker/?func=detail&atid=893831&aid=1936539&group_id=180599


QEMU/KVM: properly copy the in-kernel apicbase value

The MSR_IA32_APICBASE_ENABLE/MSR_IA32_APICBASE_BSP bits in s->apicbase
are not initialized if in-kernel APIC emulation is used, so save the 
actual value passed by cpu_set_apic_base() caller.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm-userspace.io/qemu/hw/apic.c
===================================================================
--- kvm-userspace.io/qemu/hw/apic.c
+++ kvm-userspace.io/qemu/hw/apic.c
@@ -248,8 +248,11 @@ void cpu_set_apic_base(CPUState *env, ui
 #ifdef DEBUG_APIC
     printf("cpu_set_apic_base: %016" PRIx64 "\n", val);
 #endif
-    s->apicbase = (val & 0xfffff000) |
-        (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
+    if (kvm_enabled() && qemu_kvm_irqchip_in_kernel())
+        s->apicbase = val;
+    else
+        s->apicbase = (val & 0xfffff000) |
+            (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));
     /* if disabled, cannot be enabled again */
     if (!(val & MSR_IA32_APICBASE_ENABLE)) {
         s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;
Index: marcelo/git/kvm-userspace.io/qemu/qemu-kvm-x86.c
===================================================================
--- marcelo.orig/git/kvm-userspace.io/qemu/qemu-kvm-x86.c
+++ marcelo/git/kvm-userspace.io/qemu/qemu-kvm-x86.c
@@ -248,13 +248,8 @@ void kvm_arch_load_regs(CPUState *env)
     sregs.cr3 = env->cr[3];
     sregs.cr4 = env->cr[4];
 
-    if (kvm_irqchip_in_kernel(kvm_context)) {
-        sregs.cr8 = kvm_get_cr8(kvm_context, env->cpu_index);
-        sregs.apic_base = kvm_get_apic_base(kvm_context, env->cpu_index);
-    } else {
-        sregs.cr8 = cpu_get_apic_tpr(env);
-        sregs.apic_base = cpu_get_apic_base(env);
-    }
+    sregs.cr8 = cpu_get_apic_tpr(env);
+    sregs.apic_base = cpu_get_apic_base(env);
 
     sregs.efer = env->efer;
 

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace
  2008-04-06  9:15   ` Avi Kivity
@ 2008-04-07 20:26     ` Marcelo Tosatti
  2008-04-08  1:17       ` Avi Kivity
  0 siblings, 1 reply; 12+ messages in thread
From: Marcelo Tosatti @ 2008-04-07 20:26 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm-devel

On Sun, Apr 06, 2008 at 12:15:07PM +0300, Avi Kivity wrote:
> Marcelo Tosatti wrote:
> >Otherwise a signal can be received in userspace and a vcpu goes back
> >to the kernel while it should stay still.
> >
> >Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
> >
> >Index: kvm-userspace.io/qemu/qemu-kvm.c
> >===================================================================
> >--- kvm-userspace.io.orig/qemu/qemu-kvm.c
> >+++ kvm-userspace.io/qemu/qemu-kvm.c
> >@@ -350,7 +350,6 @@ static void *ap_main_loop(void *_env)
> >     vcpu->env = env;
> >     vcpu->env->thread_id = kvm_get_thread_id();
> >     sigfillset(&signals);
> >-    sigdelset(&signals, SIG_IPI);
> >     sigprocmask(SIG_BLOCK, &signals, NULL);
> >     kvm_create_vcpu(kvm_context, env->cpu_index);
> >     kvm_qemu_init_env(env);
> >
> >  
> 
> Does this work with -no-kvm-irqchip?

Yes. SIG_IPI was blocked before the IO thread.

> I think we need to fix the kernel to handle random signals.  Otherwise 
> even attaching a debugger can change guest behavior (I think).

Well ptrace forces signals so SIGSTOP is delivered even though the child
has blocked them.

Attaching a debugger does change behaviour since SIGSTOP will send a
vcpu back to userspace.

Can you be more specific?


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace
  2008-04-07 20:26     ` Marcelo Tosatti
@ 2008-04-08  1:17       ` Avi Kivity
  0 siblings, 0 replies; 12+ messages in thread
From: Avi Kivity @ 2008-04-08  1:17 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm-devel

Marcelo Tosatti wrote:
> On Sun, Apr 06, 2008 at 12:15:07PM +0300, Avi Kivity wrote:
>   
>> Marcelo Tosatti wrote:
>>     
>>> Otherwise a signal can be received in userspace and a vcpu goes back
>>> to the kernel while it should stay still.
>>>
>>> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>>>
>>> Index: kvm-userspace.io/qemu/qemu-kvm.c
>>> ===================================================================
>>> --- kvm-userspace.io.orig/qemu/qemu-kvm.c
>>> +++ kvm-userspace.io/qemu/qemu-kvm.c
>>> @@ -350,7 +350,6 @@ static void *ap_main_loop(void *_env)
>>>     vcpu->env = env;
>>>     vcpu->env->thread_id = kvm_get_thread_id();
>>>     sigfillset(&signals);
>>> -    sigdelset(&signals, SIG_IPI);
>>>     sigprocmask(SIG_BLOCK, &signals, NULL);
>>>     kvm_create_vcpu(kvm_context, env->cpu_index);
>>>     kvm_qemu_init_env(env);
>>>
>>>  
>>>       
>> Does this work with -no-kvm-irqchip?
>>     
>
> Yes. SIG_IPI was blocked before the IO thread.
>
>   

Okay (of course; it is blocked, but still dequeued by sigtimedwait).

>> I think we need to fix the kernel to handle random signals.  Otherwise 
>> even attaching a debugger can change guest behavior (I think).
>>     
>
> Well ptrace forces signals so SIGSTOP is delivered even though the child
> has blocked them.
>
> Attaching a debugger does change behaviour since SIGSTOP will send a
> vcpu back to userspace.
>
> Can you be more specific?
>
>   

I misunderstood. I thought something about a spurious signal being 
received in the kernel, dropping it out of hlt state, and confusing the 
guest; but the real issue is the signal getting lost completely if it is 
delivered to userspace instead of sigtimedwait(), which this patch fixes.

-- 
Any sufficiently difficult bug is indistinguishable from a feature.


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2008-04-08  1:17 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-05 18:22 [patch 0/4] fix SMP migration and savevm/loadvm Marcelo Tosatti
2008-04-05 18:22 ` [patch 1/4] QEMU/KVM: only use KVM apic registers if vm is running Marcelo Tosatti
2008-04-06  9:09   ` Avi Kivity
2008-04-05 18:22 ` [patch 2/4] QEMU/KVM: save and load mp state Marcelo Tosatti
2008-04-06  9:13   ` Avi Kivity
2008-04-05 18:22 ` [patch 3/4] QEMU/KVM: ignore SIG_IPI signals in userspace Marcelo Tosatti
2008-04-06  9:15   ` Avi Kivity
2008-04-07 20:26     ` Marcelo Tosatti
2008-04-08  1:17       ` Avi Kivity
2008-04-05 18:22 ` [patch 4/4] QEMU/KVM: dont read any bits from userspace APIC emulation if its done in-kernel Marcelo Tosatti
2008-04-06  9:18   ` Avi Kivity
2008-04-07 17:35     ` Marcelo Tosatti

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox