Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32ae83ff authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents 94a76d9b e0917f87
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -34,10 +34,13 @@ static inline void time_travel_set_time(unsigned long long ns)
	time_travel_time = ns;
}

static inline void time_travel_set_timer(enum time_travel_timer_mode mode,
					 unsigned long long expiry)
static inline void time_travel_set_timer_mode(enum time_travel_timer_mode mode)
{
	time_travel_timer_mode = mode;
}

static inline void time_travel_set_timer_expiry(unsigned long long expiry)
{
	time_travel_timer_expiry = expiry;
}
#else
@@ -50,8 +53,11 @@ static inline void time_travel_set_time(unsigned long long ns)
{
}

static inline void time_travel_set_timer(enum time_travel_timer_mode mode,
					 unsigned long long expiry)
static inline void time_travel_set_timer_mode(enum time_travel_timer_mode mode)
{
}

static inline void time_travel_set_timer_expiry(unsigned long long expiry)
{
}

+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ static void time_travel_sleep(unsigned long long duration)
	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(TT_TMR_DISABLED, 0);
			time_travel_set_timer_mode(TT_TMR_DISABLED);
		/*
		 * time_travel_time will be adjusted in the timer
		 * IRQ handler so it works even when the signal
+9 −7
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
static int itimer_shutdown(struct clock_event_device *evt)
{
	if (time_travel_mode != TT_MODE_OFF)
		time_travel_set_timer(TT_TMR_DISABLED, 0);
		time_travel_set_timer_mode(TT_TMR_DISABLED);

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

	if (time_travel_mode != TT_MODE_OFF)
		time_travel_set_timer(TT_TMR_PERIODIC,
				      time_travel_time + interval);
	if (time_travel_mode != TT_MODE_OFF) {
		time_travel_set_timer_mode(TT_TMR_PERIODIC);
		time_travel_set_timer_expiry(time_travel_time + interval);
	}

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

	if (time_travel_mode != TT_MODE_OFF)
		time_travel_set_timer(TT_TMR_ONESHOT,
				      time_travel_time + delta);
	if (time_travel_mode != TT_MODE_OFF) {
		time_travel_set_timer_mode(TT_TMR_ONESHOT);
		time_travel_set_timer_expiry(time_travel_time + delta);
	}

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