Skip to content

Commit e0917f8

Browse files
jmberg-intelrichardweinberger
authored andcommitted
um: fix time travel mode
Unfortunately, my build fix for when time travel mode isn't enabled broke time travel mode, because I forgot that we need to use the timer time after the timer has been marked disabled, and thus need to leave the time stored instead of zeroing it. Fix that by splitting the inline into two, so we can call only the _mode() one in the relevant code path. Fixes: b482e48 ("um: fix build without CONFIG_UML_TIME_TRAVEL_SUPPORT") Signed-off-by: Johannes Berg <[email protected]> Signed-off-by: Richard Weinberger <[email protected]>
1 parent d1abaeb commit e0917f8

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

arch/um/include/shared/timer-internal.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,13 @@ static inline void time_travel_set_time(unsigned long long ns)
3434
time_travel_time = ns;
3535
}
3636

37-
static inline void time_travel_set_timer(enum time_travel_timer_mode mode,
38-
unsigned long long expiry)
37+
static inline void time_travel_set_timer_mode(enum time_travel_timer_mode mode)
3938
{
4039
time_travel_timer_mode = mode;
40+
}
41+
42+
static inline void time_travel_set_timer_expiry(unsigned long long expiry)
43+
{
4144
time_travel_timer_expiry = expiry;
4245
}
4346
#else
@@ -50,8 +53,11 @@ static inline void time_travel_set_time(unsigned long long ns)
5053
{
5154
}
5255

53-
static inline void time_travel_set_timer(enum time_travel_timer_mode mode,
54-
unsigned long long expiry)
56+
static inline void time_travel_set_timer_mode(enum time_travel_timer_mode mode)
57+
{
58+
}
59+
60+
static inline void time_travel_set_timer_expiry(unsigned long long expiry)
5561
{
5662
}
5763

arch/um/kernel/process.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ static void time_travel_sleep(unsigned long long duration)
213213
if (time_travel_timer_mode != TT_TMR_DISABLED ||
214214
time_travel_timer_expiry < next) {
215215
if (time_travel_timer_mode == TT_TMR_ONESHOT)
216-
time_travel_set_timer(TT_TMR_DISABLED, 0);
216+
time_travel_set_timer_mode(TT_TMR_DISABLED);
217217
/*
218218
* time_travel_time will be adjusted in the timer
219219
* IRQ handler so it works even when the signal

arch/um/kernel/time.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
5050
static int itimer_shutdown(struct clock_event_device *evt)
5151
{
5252
if (time_travel_mode != TT_MODE_OFF)
53-
time_travel_set_timer(TT_TMR_DISABLED, 0);
53+
time_travel_set_timer_mode(TT_TMR_DISABLED);
5454

5555
if (time_travel_mode != TT_MODE_INFCPU)
5656
os_timer_disable();
@@ -62,9 +62,10 @@ static int itimer_set_periodic(struct clock_event_device *evt)
6262
{
6363
unsigned long long interval = NSEC_PER_SEC / HZ;
6464

65-
if (time_travel_mode != TT_MODE_OFF)
66-
time_travel_set_timer(TT_TMR_PERIODIC,
67-
time_travel_time + interval);
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+
}
6869

6970
if (time_travel_mode != TT_MODE_INFCPU)
7071
os_timer_set_interval(interval);
@@ -77,9 +78,10 @@ static int itimer_next_event(unsigned long delta,
7778
{
7879
delta += 1;
7980

80-
if (time_travel_mode != TT_MODE_OFF)
81-
time_travel_set_timer(TT_TMR_ONESHOT,
82-
time_travel_time + delta);
81+
if (time_travel_mode != TT_MODE_OFF) {
82+
time_travel_set_timer_mode(TT_TMR_ONESHOT);
83+
time_travel_set_timer_expiry(time_travel_time + delta);
84+
}
8385

8486
if (time_travel_mode != TT_MODE_INFCPU)
8587
return os_timer_one_shot(delta);

0 commit comments

Comments
 (0)