[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 05/11] tell kernel about all registers instead of ju
From: |
Glauber Costa |
Subject: |
[Qemu-devel] [PATCH 05/11] tell kernel about all registers instead of just mp_state |
Date: |
Wed, 2 Dec 2009 11:48:16 -0200 |
This fix a bug with -smp in kvm. Since we have updated apic_base,
we also have to tell kernel about it. So instead of just updating
mp_state, update every regs.
It is mandatory that this happens synchronously, without waiting for
the next vcpu run. Otherwise, if we are migrating, or initializing
the cpu's APIC, other cpus can still see an invalid state.
Since putting registers already happen in vcpu entry, we factor
out the required code in cpu_flush_state()
Signed-off-by: Glauber Costa <address@hidden>
---
hw/apic-kvm.c | 5 ++++-
kvm-all.c | 13 +++++++++----
kvm.h | 8 ++++++++
3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/hw/apic-kvm.c b/hw/apic-kvm.c
index e5a0bfc..9e9790f 100644
--- a/hw/apic-kvm.c
+++ b/hw/apic-kvm.c
@@ -126,7 +126,10 @@ static void kvm_apic_reset(void *opaque)
s->cpu_env->mp_state
= bsp ? KVM_MP_STATE_RUNNABLE : KVM_MP_STATE_UNINITIALIZED;
- kvm_put_mp_state(s->cpu_env);
+ /* We have to tell the kernel about mp_state, but also save sregs, since
+ * apic base was just updated
+ */
+ cpu_flush_state(s->cpu_env);
if (bsp) {
/*
diff --git a/kvm-all.c b/kvm-all.c
index f7d89c6..596416a 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -612,6 +612,14 @@ void kvm_cpu_synchronize_state(CPUState *env)
}
}
+void kvm_cpu_flush_state(CPUState *env)
+{
+ if (env->kvm_state->regs_modified) {
+ kvm_arch_put_registers(env);
+ env->kvm_state->regs_modified = 0;
+ }
+}
+
int kvm_cpu_exec(CPUState *env)
{
struct kvm_run *run = env->kvm_run;
@@ -626,10 +634,7 @@ int kvm_cpu_exec(CPUState *env)
break;
}
- if (env->kvm_state->regs_modified) {
- kvm_arch_put_registers(env);
- env->kvm_state->regs_modified = 0;
- }
+ kvm_cpu_flush_state(env);
kvm_arch_pre_run(env, run);
qemu_mutex_unlock_iothread();
diff --git a/kvm.h b/kvm.h
index 15fb34a..7b9d8b3 100644
--- a/kvm.h
+++ b/kvm.h
@@ -144,6 +144,7 @@ int kvm_check_extension(KVMState *s, unsigned int
extension);
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
int reg);
void kvm_cpu_synchronize_state(CPUState *env);
+void kvm_cpu_flush_state(CPUState *env);
/* generic hooks - to be moved/refactored once there are more users */
@@ -154,4 +155,11 @@ static inline void cpu_synchronize_state(CPUState *env)
}
}
+static inline void cpu_flush_state(CPUState *env)
+{
+ if (kvm_enabled()) {
+ kvm_cpu_flush_state(env);
+ }
+}
+
#endif
--
1.6.5.2
- [Qemu-devel] [PATCH 00/11] SMP support in qemu.git, Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 01/11] Don't mess with halted state., Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 02/11] store thread-specific env information, Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 03/11] update halted state on mp_state sync, Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 04/11] qemu_flush_work for remote vcpu execution, Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 05/11] tell kernel about all registers instead of just mp_state,
Glauber Costa <=
- [Qemu-devel] [PATCH 06/11] flush state in migration post_load, Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 07/11] Don't call kvm cpu reset on initialization, Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 08/11] use cpu_kick instead of direct signalling., Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 09/11] Use per-cpu reset handlers., Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 10/11] Use __thread where available., Glauber Costa, 2009/12/02
- [Qemu-devel] [PATCH 11/11] remove smp restriction from kvm, Glauber Costa, 2009/12/02
- [Qemu-devel] Re: [PATCH 11/11] remove smp restriction from kvm, Avi Kivity, 2009/12/03
- Re: [Qemu-devel] Re: [PATCH 11/11] remove smp restriction from kvm, Glauber Costa, 2009/12/03
- Re: [Qemu-devel] Re: [PATCH 11/11] remove smp restriction from kvm, Avi Kivity, 2009/12/03
- Re: [Qemu-devel] Re: [PATCH 11/11] remove smp restriction from kvm, Glauber Costa, 2009/12/03