+ cpu_physical_memory_read(kvmclock_struct_pa, &time, sizeof(time));
+
+ delta = migration_tsc - time.tsc_timestamp;
Hi,
when I was testing live storage migration with libvirt I found out that
this patch can cause virtual machine to hang when completing mirror job.
This is (probably) because kvmclock_current_nsec() is called twice in a
row and on second call time.tsc_timestamp is larger than migration_tsc.
This causes delta to be huge and sets timer to invalid value.
The double call happens when switching from old to new disk (pivoting in
libvirt's nomenclature).
Example values:
First call: migration_tsc: 12052203518652476, time_tsc:
12052203301565676, delta 108543400
Second call: migration_tsc: 12052203518652476, time_tsc:
12052204478600322, delta 9223372036374801885
Perhaps it is worth adding:
if (time.tsc_timestamp > migration_tsc) {
return 0;
}
there? Untested though...
--
mg