提交 f695cf94 编写于 作者: J John Stultz

time: Fix change_clocksource locking

change_clocksource() fails to grab locks or call timekeeping_update(),
which leaves a race window for time inconsistencies.

This adds proper locking and a call to timekeeping_update() to fix this.

CC: Andy Lutomirski <luto@amacapital.net>
CC: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: NJohn Stultz <john.stultz@linaro.org>
上级 a939e817
...@@ -448,9 +448,12 @@ EXPORT_SYMBOL(timekeeping_inject_offset); ...@@ -448,9 +448,12 @@ EXPORT_SYMBOL(timekeeping_inject_offset);
static int change_clocksource(void *data) static int change_clocksource(void *data)
{ {
struct clocksource *new, *old; struct clocksource *new, *old;
unsigned long flags;
new = (struct clocksource *) data; new = (struct clocksource *) data;
write_seqlock_irqsave(&timekeeper.lock, flags);
timekeeping_forward_now(); timekeeping_forward_now();
if (!new->enable || new->enable(new) == 0) { if (!new->enable || new->enable(new) == 0) {
old = timekeeper.clock; old = timekeeper.clock;
...@@ -458,6 +461,10 @@ static int change_clocksource(void *data) ...@@ -458,6 +461,10 @@ static int change_clocksource(void *data)
if (old->disable) if (old->disable)
old->disable(old); old->disable(old);
} }
timekeeping_update(true);
write_sequnlock_irqrestore(&timekeeper.lock, flags);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册