diff --git a/include/qemu/timer.h b/include/qemu/timer.h index e5bd494c07..9e4f90f4aa 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -787,6 +787,15 @@ static inline int64_t get_ticks_per_sec(void) return 1000000000LL; } +static inline int64_t get_max_clock_jump(void) +{ + /* This should be small enough to prevent excessive interrupts from being + * generated by the RTC on clock jumps, but large enough to avoid frequent + * unnecessary resets in idle VMs. + */ + return 60 * get_ticks_per_sec(); +} + /* * Low level clock functions */ diff --git a/qemu-timer.c b/qemu-timer.c index 5741f0d0e0..aa6757e359 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -573,7 +573,7 @@ int64_t qemu_clock_get_ns(QEMUClockType type) now = get_clock_realtime(); last = clock->last; clock->last = now; - if (now < last) { + if (now < last || now > (last + get_max_clock_jump())) { notifier_list_notify(&clock->reset_notifiers, &now); } return now;