Merge tag 'for-linus-5.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml

Pull UML fix from Richard Weinberger:
"Fix time travel mode"

* tag 'for-linus-5.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml:
um: fix time travel mode

+20 -12
+10 -4
arch/um/include/shared/timer-internal.h
··· 34 time_travel_time = ns; 35 } 36 37 - static inline void time_travel_set_timer(enum time_travel_timer_mode mode, 38 - unsigned long long expiry) 39 { 40 time_travel_timer_mode = mode; 41 time_travel_timer_expiry = expiry; 42 } 43 #else ··· 53 { 54 } 55 56 - static inline void time_travel_set_timer(enum time_travel_timer_mode mode, 57 - unsigned long long expiry) 58 { 59 } 60
··· 34 time_travel_time = ns; 35 } 36 37 + static inline void time_travel_set_timer_mode(enum time_travel_timer_mode mode) 38 { 39 time_travel_timer_mode = mode; 40 + } 41 + 42 + static inline void time_travel_set_timer_expiry(unsigned long long expiry) 43 + { 44 time_travel_timer_expiry = expiry; 45 } 46 #else ··· 50 { 51 } 52 53 + static inline void time_travel_set_timer_mode(enum time_travel_timer_mode mode) 54 + { 55 + } 56 + 57 + static inline void time_travel_set_timer_expiry(unsigned long long expiry) 58 { 59 } 60
+1 -1
arch/um/kernel/process.c
··· 213 if (time_travel_timer_mode != TT_TMR_DISABLED || 214 time_travel_timer_expiry < next) { 215 if (time_travel_timer_mode == TT_TMR_ONESHOT) 216 - time_travel_set_timer(TT_TMR_DISABLED, 0); 217 /* 218 * time_travel_time will be adjusted in the timer 219 * IRQ handler so it works even when the signal
··· 213 if (time_travel_timer_mode != TT_TMR_DISABLED || 214 time_travel_timer_expiry < next) { 215 if (time_travel_timer_mode == TT_TMR_ONESHOT) 216 + time_travel_set_timer_mode(TT_TMR_DISABLED); 217 /* 218 * time_travel_time will be adjusted in the timer 219 * IRQ handler so it works even when the signal
+9 -7
arch/um/kernel/time.c
··· 50 static int itimer_shutdown(struct clock_event_device *evt) 51 { 52 if (time_travel_mode != TT_MODE_OFF) 53 - time_travel_set_timer(TT_TMR_DISABLED, 0); 54 55 if (time_travel_mode != TT_MODE_INFCPU) 56 os_timer_disable(); ··· 62 { 63 unsigned long long interval = NSEC_PER_SEC / HZ; 64 65 - if (time_travel_mode != TT_MODE_OFF) 66 - time_travel_set_timer(TT_TMR_PERIODIC, 67 - time_travel_time + interval); 68 69 if (time_travel_mode != TT_MODE_INFCPU) 70 os_timer_set_interval(interval); ··· 78 { 79 delta += 1; 80 81 - if (time_travel_mode != TT_MODE_OFF) 82 - time_travel_set_timer(TT_TMR_ONESHOT, 83 - time_travel_time + delta); 84 85 if (time_travel_mode != TT_MODE_INFCPU) 86 return os_timer_one_shot(delta);
··· 50 static int itimer_shutdown(struct clock_event_device *evt) 51 { 52 if (time_travel_mode != TT_MODE_OFF) 53 + time_travel_set_timer_mode(TT_TMR_DISABLED); 54 55 if (time_travel_mode != TT_MODE_INFCPU) 56 os_timer_disable(); ··· 62 { 63 unsigned long long interval = NSEC_PER_SEC / HZ; 64 65 + if (time_travel_mode != TT_MODE_OFF) { 66 + time_travel_set_timer_mode(TT_TMR_PERIODIC); 67 + time_travel_set_timer_expiry(time_travel_time + interval); 68 + } 69 70 if (time_travel_mode != TT_MODE_INFCPU) 71 os_timer_set_interval(interval); ··· 77 { 78 delta += 1; 79 80 + if (time_travel_mode != TT_MODE_OFF) { 81 + time_travel_set_timer_mode(TT_TMR_ONESHOT); 82 + time_travel_set_timer_expiry(time_travel_time + delta); 83 + } 84 85 if (time_travel_mode != TT_MODE_INFCPU) 86 return os_timer_one_shot(delta);