kvmclock: Add comment explaining why we need cpu_clean_all_dirty()
PATCH 1/1 kvmclock: Add comment explaining why we need cpu_clean_all_dirty()
Try to explain why commit 317b0a6d8ba44e9bf8f9c3dbd776c4536843d82c needed a cpu_clean_all_dirty() call just after calling cpu_synchronize_all_states().
Signed-off-by Eduardo Habkost <[email protected]>
Cc Andrey Korolyov <[email protected]>
Cc Marcin Gibuła <[email protected]>
Cc Marcelo Tosatti <[email protected]>
Cc Paolo Bonzini <[email protected]>
--- hw/i386/kvm/clock.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
hw/i386/kvm/clock.c +14 -0
@@ -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));
Signature · 1 line
1.9.3
Quoted 30 lines · Eduardo Habkost
Try to explain why commit
317b0a6d8ba44e9bf8f9c3dbd776c4536843d82cneeded acpu_clean_all_dirty()call just after callingcpu_synchronize_all_states().Signed-off-by Eduardo Habkost <[email protected]>Cc Andrey Korolyov <[email protected]>Cc Marcin Gibuła <[email protected]>Cc Marcelo Tosatti <[email protected]>Cc Paolo Bonzini <[email protected]>--- hw/i386/kvm/clock.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)hw/i386/kvm/clock.c +8
-0@@ -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.
hw/i386/kvm/clock.c static void kvmclock_vm_state_change(void *opaque, int running, · line 147
Quoted 10 lines
hw/i386/kvm/clock.c +6
-0+* +* 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));
Thanks, applying to uq/master.
Paolo