alistair23-linux/kernel/time
Thomas Gleixner 6bad6bccf2 timers: Prevent base clock corruption when forwarding
When a timer is enqueued we try to forward the timer base clock. This
mechanism has two issues:

1) Forwarding a remote base unlocked

The forwarding function is called from get_target_base() with the current
timer base lock held. But if the new target base is a different base than
the current base (can happen with NOHZ, sigh!) then the forwarding is done
on an unlocked base. This can lead to corruption of base->clk.

Solution is simple: Invoke the forwarding after the target base is locked.

2) Possible corruption due to jiffies advancing

This is similar to the issue in get_net_timer_interrupt() which was fixed
in the previous patch. jiffies can advance between check and assignement
and therefore advancing base->clk beyond the next expiry value.

So we need to read jiffies into a local variable once and do the checks and
assignment with the local copy.

Fixes: a683f390b93f("timers: Forward the wheel clock whenever possible")
Reported-by: Ashton Holmes <scoopta@gmail.com>
Reported-by: Michael Thayer <michael.thayer@oracle.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Michal Necasek <michal.necasek@oracle.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: knut.osmundsen@oracle.com
Cc: stable@vger.kernel.org
Cc: stern@rowland.harvard.edu
Cc: rt@linutronix.de
Link: http://lkml.kernel.org/r/20161022110552.253640125@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2016-10-25 16:32:50 +02:00
..
alarmtimer.c alarmtimer: Remove unused but set variable 2016-10-17 11:59:37 +02:00
clockevents.c clockevents: Make clockevents_subsys static 2016-07-19 10:48:06 +02:00
clocksource.c clocksource: Defer override invalidation unless clock is unstable 2016-08-31 14:43:33 -07:00
hrtimer.c time: Avoid undefined behaviour in ktime_add_safe() 2016-08-31 14:43:36 -07:00
itimer.c
jiffies.c
Kconfig
Makefile
ntp.c
ntp_internal.h
posix-clock.c
posix-cpu-timers.c posix_cpu_timer: Exit early when process has been reaped 2016-07-11 17:20:12 +02:00
posix-timers.c
sched_clock.c
test_udelay.c time: Avoid timespec in udelay_test 2016-06-20 12:47:26 -07:00
tick-broadcast-hrtimer.c tick/broadcast-hrtimer: Set name of the ce_broadcast_hrtimer 2016-07-05 17:02:19 +02:00
tick-broadcast.c
tick-common.c
tick-internal.h timers: Forward the wheel clock whenever possible 2016-07-07 10:35:11 +02:00
tick-oneshot.c
tick-sched.c tick/nohz: Prevent stopping the tick on an offline CPU 2016-09-13 17:53:52 +02:00
tick-sched.h
time.c time: Avoid undefined behaviour in timespec64_add_safe() 2016-08-31 14:43:35 -07:00
timeconst.bc
timeconv.c time: Add time64_to_tm() 2016-06-20 12:47:15 -07:00
timecounter.c
timekeeping.c timekeeping: Fix __ktime_get_fast_ns() regression 2016-10-05 15:44:46 +02:00
timekeeping.h
timekeeping_debug.c timekeeping: Prints the amounts of time spent during suspend 2016-08-31 14:43:34 -07:00
timekeeping_internal.h
timer.c timers: Prevent base clock corruption when forwarding 2016-10-25 16:32:50 +02:00
timer_list.c
timer_stats.c timer: Avoid using timespec 2016-06-20 12:47:33 -07:00