aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel/time.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2019-09-10 17:03:53 +0200
committerRichard Weinberger <richard@nod.at>2019-09-15 21:37:13 +0200
commit278911ee89fa0f35127c0194010ffe2c17c2e3af (patch)
treef4a92533886f20c19d1e15ebde453c6fab6c6fb9 /arch/um/kernel/time.c
parentum: time-travel: Fix periodic timers (diff)
downloadlinux-dev-278911ee89fa0f35127c0194010ffe2c17c2e3af.tar.xz
linux-dev-278911ee89fa0f35127c0194010ffe2c17c2e3af.zip
um: time-travel: Restrict time update in IRQ handler
We currently do the time updates in the timer handler, even if we just call the timer handler ourselves. In basic mode we must in fact do it there since otherwise the OS timer signal won't move time forward, but in inf-cpu mode we don't need to, and it's harder to understand. Restrict the update there to basic mode, adding a comment, and do it before calling the timer_handler() in inf-cpu mode. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to '')
-rw-r--r--arch/um/kernel/time.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index 4ecabf7e54c9..15f2e88ba927 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -39,7 +39,15 @@ void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
{
unsigned long flags;
- if (time_travel_mode != TT_MODE_OFF)
+ /*
+ * In basic time-travel mode we still get real interrupts
+ * (signals) but since we don't read time from the OS, we
+ * must update the simulated time here to the expiry when
+ * we get a signal.
+ * This is not the case in inf-cpu mode, since there we
+ * never get any real signals from the OS.
+ */
+ if (time_travel_mode == TT_MODE_BASIC)
time_travel_set_time(time_travel_timer_expiry);
local_irq_save(flags);