Skip to content

Commit

Permalink
kvmclock: Add comment explaining why we need cpu_clean_all_dirty()
Browse files Browse the repository at this point in the history
Try to explain why commit 317b0a6
needed a cpu_clean_all_dirty() call just after calling
cpu_synchronize_all_states().

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Cc: Andrey Korolyov <andrey@xdel.ru>
Cc: Marcin Gibuła <m.gibula@beyond.pl>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 1154d84)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
  • Loading branch information
ehabkost authored and mdroth committed Dec 24, 2014
1 parent c35ba0d commit 2151206
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions hw/i386/kvm/clock.c
Expand Up @@ -127,7 +127,21 @@ static void kvmclock_vm_state_change(void *opaque, int running,
}

cpu_synchronize_all_states();
/* In theory, the cpu_synchronize_all_states() call above wouldn't
* affect the rest of the code, as the VCPU state inside CPUState
* is supposed to always match the VCPU state on the kernel side.
*
* In practice, calling cpu_synchronize_state() too soon will load the
* kernel-side APIC state into X86CPU.apic_state too early, APIC state
* won't be reloaded later because CPUState.vcpu_dirty==true, and
* outdated APIC state may be migrated to another host.
*
* The real fix would be to make sure outdated APIC state is read
* from the kernel again when necessary. While this is not fixed, we
* need the cpu_clean_all_dirty() call below.
*/
cpu_clean_all_dirty();

ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data);
if (ret < 0) {
fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret));
Expand Down

0 comments on commit 2151206

Please sign in to comment.