gentle ping
















At 2024-10-15 10:24:09, "shenjiatong" <yshxxsjt...@163.com> wrote:
>Under situation where virtual machine is running in a deployment where
>the system time is unstable, there is a chance that legacy OpenStack
>Windows machines without stimer enabled will crash if system time moves
>backwards and diftfix=slew is enabled. This primarily caused by the fact
>the system time moves faster than NTP server and after synchronization,
>system time flows backwards.
>
>Signed-off-by: shenjiatong <yshxxsjt...@163.com>
>---
> hw/rtc/mc146818rtc.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
>diff --git a/hw/rtc/mc146818rtc.c b/hw/rtc/mc146818rtc.c
>index 8ccee9a385..fa5d7915b1 100644
>--- a/hw/rtc/mc146818rtc.c
>+++ b/hw/rtc/mc146818rtc.c
>@@ -180,7 +180,6 @@ static void periodic_timer_update(MC146818RtcState *s, 
>int64_t current_time,
>                                 RTC_CLOCK_RATE, NANOSECONDS_PER_SECOND);
>         last_periodic_clock = next_periodic_clock - old_period;
>         lost_clock = cur_clock - last_periodic_clock;
>-        assert(lost_clock >= 0);
>     }
> 
>     /*
>@@ -199,10 +198,15 @@ static void periodic_timer_update(MC146818RtcState *s, 
>int64_t current_time,
>      */
>     if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW) {
>         uint32_t old_irq_coalesced = s->irq_coalesced;
>+        if (lost_clock >= 0) {
>+            lost_clock += old_irq_coalesced * old_period;
>+            s->irq_coalesced = lost_clock / s->period;
>+            lost_clock %= s->period;
>+        } else {
>+            s->irq_coalesced = 0;
>+            lost_clock = 0;
>+        }
> 
>-        lost_clock += old_irq_coalesced * old_period;
>-        s->irq_coalesced = lost_clock / s->period;
>-        lost_clock %= s->period;
>         if (old_irq_coalesced != s->irq_coalesced ||
>             old_period != s->period) {
>             DPRINTF_C("cmos: coalesced irqs scaled from %d to %d, "
>@@ -215,6 +219,7 @@ static void periodic_timer_update(MC146818RtcState *s, 
>int64_t current_time,
>          * no way to compensate the interrupt if LOST_TICK_POLICY_SLEW
>          * is not used, we should make the time progress anyway.
>          */
>+        lost_clock = MAX(0, lost_clock);
>         lost_clock = MIN(lost_clock, period);
>     }
> 
>-- 
>2.43.0

Reply via email to