* [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