aboutsummaryrefslogtreecommitdiff
path: root/kvm-all.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2010-05-04 09:45:23 -0300
committerMarcelo Tosatti <mtosatti@redhat.com>2010-05-11 14:02:22 -0300
commit2705d56a6a7e9c7833e04d33aedbc01d2280a280 (patch)
tree95c33a7acfb882d07f817c23db80fbb22afb6216 /kvm-all.c
parente82bcec25f19846bfb899d55c9fb5915516b378a (diff)
downloadqemu-2705d56a6a7e9c7833e04d33aedbc01d2280a280.zip
qemu-2705d56a6a7e9c7833e04d33aedbc01d2280a280.tar.gz
qemu-2705d56a6a7e9c7833e04d33aedbc01d2280a280.tar.bz2
kvm: synchronize state from cpu context
It is not safe to retrieve the KVM internal state of a given cpu while its potentially modifying it. Queue the request to run on cpu context, similarly to qemu-kvm. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'kvm-all.c')
-rw-r--r--kvm-all.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/kvm-all.c b/kvm-all.c
index fbd084c..e766202 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -796,14 +796,22 @@ void kvm_flush_coalesced_mmio_buffer(void)
#endif
}
-void kvm_cpu_synchronize_state(CPUState *env)
+static void do_kvm_cpu_synchronize_state(void *_env)
{
+ CPUState *env = _env;
+
if (!env->kvm_vcpu_dirty) {
kvm_arch_get_registers(env);
env->kvm_vcpu_dirty = 1;
}
}
+void kvm_cpu_synchronize_state(CPUState *env)
+{
+ if (!env->kvm_vcpu_dirty)
+ run_on_cpu(env, do_kvm_cpu_synchronize_state, env);
+}
+
void kvm_cpu_synchronize_post_reset(CPUState *env)
{
kvm_arch_put_registers(env, KVM_PUT_RESET_STATE);