diff --git a/arch/um/include/shared/timer-internal.h b/arch/um/include/shared/timer-internal.h index 9991ec2371e4..a4d79389b223 100644 --- a/arch/um/include/shared/timer-internal.h +++ b/arch/um/include/shared/timer-internal.h @@ -43,6 +43,11 @@ static inline void time_travel_set_timer_expiry(unsigned long long expiry) { time_travel_timer_expiry = expiry; } + +static inline void time_travel_set_timer_interval(unsigned long long interval) +{ + time_travel_timer_interval = interval; +} #else #define time_travel_mode TT_MODE_OFF #define time_travel_time 0 @@ -61,6 +66,10 @@ static inline void time_travel_set_timer_expiry(unsigned long long expiry) { } +static inline void time_travel_set_timer_interval(unsigned long long interval) +{ +} + #define time_travel_timer_mode TT_TMR_DISABLED #endif diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 6bede7888fc2..cf242fc5fe94 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -210,7 +210,12 @@ static void time_travel_sleep(unsigned long long duration) if (time_travel_mode != TT_MODE_INFCPU) os_timer_disable(); - if (time_travel_timer_mode != TT_TMR_DISABLED || + while (time_travel_timer_mode == TT_TMR_PERIODIC && + time_travel_timer_expiry < time_travel_time) + time_travel_set_timer_expiry(time_travel_timer_expiry + + time_travel_timer_interval); + + if (time_travel_timer_mode != TT_TMR_DISABLED && time_travel_timer_expiry < next) { if (time_travel_timer_mode == TT_TMR_ONESHOT) time_travel_set_timer_mode(TT_TMR_DISABLED); diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index 234757233355..4ecabf7e54c9 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c @@ -65,6 +65,7 @@ static int itimer_set_periodic(struct clock_event_device *evt) if (time_travel_mode != TT_MODE_OFF) { time_travel_set_timer_mode(TT_TMR_PERIODIC); time_travel_set_timer_expiry(time_travel_time + interval); + time_travel_set_timer_interval(interval); } if (time_travel_mode != TT_MODE_INFCPU)