diff options
author | Gleb Natapov <gleb@redhat.com> | 2009-10-14 15:52:32 +0200 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2009-10-14 15:35:06 -0300 |
commit | b8a7857071b477b28d3055e33ff0298fc91f329a (patch) | |
tree | 138cbf2456d3637930dfea09edf53905e41aba82 /qemu-kvm.c | |
parent | Complete cpu initialization before signaling main thread. (diff) | |
download | qemu-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.c | 9 |
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) |