]> Git Repo - qemu.git/commitdiff
mc146818rtc: Reset the periodic timer on load
authorPaul Donohue <[email protected]>
Fri, 12 Jun 2015 14:10:14 +0000 (10:10 -0400)
committerPaolo Bonzini <[email protected]>
Fri, 19 Jun 2015 10:27:14 +0000 (12:27 +0200)
When loading a VM from a snapshot or migration, clock changes can cause
the periodic timer to stall or loop rapidly.

qemu-timer has a reset notifier mechanism that is used to avoid timer
stalls or loops if the host clock changes while the VM is running when
using QEMU_CLOCK_HOST.  However, when loading a snapshot or migration,
qemu-timer is initialized and fires the reset notifier before
mc146818rtc is initialized and has registered its reset handler.  In
addition, this mechanism isn't used when using QEMU_CLOCK_REALTIME,
which might also change when loading a snapshot or migration.

To correct that problem, this commit resets the periodic timer after
loading from a snapshot or migration if the clock has either jumped
backward or has jumped forward by more than the clock jump limit that
is used by the reset notifier code in qemu-timer.

Signed-off-by: Paul Donohue <[email protected]>
Message-Id: <20150612141013[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
hw/timer/mc146818rtc.c

index 32048258c963147717831b1adb233a2ab233fccd..2e3ffc8c073e7f722d9149ea601fb5da0c7e363a 100644 (file)
@@ -723,6 +723,12 @@ static int rtc_post_load(void *opaque, int version_id)
         check_update_timer(s);
     }
 
+    uint64_t now = qemu_clock_get_ns(rtc_clock);
+    if (now < s->next_periodic_time ||
+        now > (s->next_periodic_time + get_max_clock_jump())) {
+        periodic_timer_update(s, qemu_clock_get_ns(rtc_clock));
+    }
+
 #ifdef TARGET_I386
     if (version_id >= 2) {
         if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW) {
This page took 0.028639 seconds and 4 git commands to generate.