+    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

Reply via email to