aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Natapov <gleb@redhat.com>2009-10-14 15:52:32 +0200
committerMarcelo Tosatti <mtosatti@redhat.com>2009-10-14 15:35:06 -0300
commitb8a7857071b477b28d3055e33ff0298fc91f329a (patch)
tree138cbf2456d3637930dfea09edf53905e41aba82 /qemu-kvm.c
parentComplete cpu initialization before signaling main thread. (diff)
downloadqemu-kvm-b8a7857071b477b28d3055e33ff0298fc91f329a.tar.gz
qemu-kvm-b8a7857071b477b28d3055e33ff0298fc91f329a.tar.bz2
qemu-kvm-b8a7857071b477b28d3055e33ff0298fc91f329a.zip
Don't sync mpstate to/from kernel when unneeded.
mp_state, unlike other cpu state, can be changed not only from vcpu context it belongs to, but by other vcpus too. That makes its loading from kernel/saving back not safe if mp_state value is changed inside kernel between load and save. For example vcpu 1 loads mp_sate into user-space and the state is RUNNING, vcpu 0 sends INIT/SIPI to vcpu 1 so in-kernel mp_sate becomes SIPI, vcpu 1 save user-space copy into kernel and calls vcpu_run(). SIPI sate is lost. The patch copies mp_sate into kernel only when it is knows that int-kernel value is outdated. This happens on reset and vmload. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'qemu-kvm.c')
-rw-r--r--qemu-kvm.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/qemu-kvm.c b/qemu-kvm.c
index b6c36e039..e168db2c3 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1579,11 +1579,6 @@ static void on_vcpu(CPUState *env, void (*func)(void *data), void *data)
void kvm_arch_get_registers(CPUState *env)
{
kvm_arch_save_regs(env);
- kvm_arch_save_mpstate(env);
-#ifdef KVM_CAP_MP_STATE
- if (kvm_irqchip_in_kernel())
- env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
-#endif
}
static void do_kvm_cpu_synchronize_state(void *_env)
@@ -1677,6 +1672,10 @@ static void kvm_do_save_mpstate(void *_env)
CPUState *env = _env;
kvm_arch_save_mpstate(env);
+#ifdef KVM_CAP_MP_STATE
+ if (kvm_irqchip_in_kernel())
+ env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
+#endif
}
void kvm_save_mpstate(CPUState *env)