kernel-fxtec-pro1x/kernel/time
John Stultz 833f32d763 time: Prevent early expiry of hrtimers[CLOCK_REALTIME] at the leap second edge
Currently, leapsecond adjustments are done at tick time. As a result,
the leapsecond was applied at the first timer tick *after* the
leapsecond (~1-10ms late depending on HZ), rather then exactly on the
second edge.

This was in part historical from back when we were always tick based,
but correcting this since has been avoided since it adds extra
conditional checks in the gettime fastpath, which has performance
overhead.

However, it was recently pointed out that ABS_TIME CLOCK_REALTIME
timers set for right after the leapsecond could fire a second early,
since some timers may be expired before we trigger the timekeeping
timer, which then applies the leapsecond.

This isn't quite as bad as it sounds, since behaviorally it is similar
to what is possible w/ ntpd made leapsecond adjustments done w/o using
the kernel discipline. Where due to latencies, timers may fire just
prior to the settimeofday call. (Also, one should note that all
applications using CLOCK_REALTIME timers should always be careful,
since they are prone to quirks from settimeofday() disturbances.)

However, the purpose of having the kernel do the leap adjustment is to
avoid such latencies, so I think this is worth fixing.

So in order to properly keep those timers from firing a second early,
this patch modifies the ntp and timekeeping logic so that we keep
enough state so that the update_base_offsets_now accessor, which
provides the hrtimer core the current time, can check and apply the
leapsecond adjustment on the second edge. This prevents the hrtimer
core from expiring timers too early.

This patch does not modify any other time read path, so no additional
overhead is incurred. However, this also means that the leap-second
continues to be applied at tick time for all other read-paths.

Apologies to Richard Cochran, who pushed for similar changes years
ago, which I resisted due to the concerns about the performance
overhead.

While I suspect this isn't extremely critical, folks who care about
strict leap-second correctness will likely want to watch
this. Potentially a -stable candidate eventually.

Originally-suggested-by: Richard Cochran <richardcochran@gmail.com>
Reported-by: Daniel Bristot de Oliveira <bristot@redhat.com>
Reported-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Jiri Bohac <jbohac@suse.cz>
Cc: Shuah Khan <shuahkh@osg.samsung.com>
Cc: Ingo Molnar <mingo@kernel.org>
Link: http://lkml.kernel.org/r/1434063297-28657-4-git-send-email-john.stultz@linaro.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2015-06-12 11:15:49 +02:00
..
alarmtimer.c alarmtimer: Get rid of unused return value 2015-04-22 17:06:52 +02:00
clockevents.c clockevents: Use set/get state helper functions 2015-06-02 14:40:48 +02:00
clocksource.c clocksource: Use current logging style 2015-06-10 11:31:14 +02:00
hrtimer.c clockevents: Stop unused clockevent devices 2015-05-19 16:18:11 +02:00
itimer.c
jiffies.c tick: Move clocksource related stuff to timekeeping.h 2015-04-01 14:22:58 +02:00
Kconfig clockevents: Remove CONFIG_GENERIC_CLOCKEVENTS_BUILD 2015-04-01 14:22:57 +02:00
Makefile time: Move timeconst.h into include/generated 2015-05-19 15:13:45 +02:00
ntp.c time: Prevent early expiry of hrtimers[CLOCK_REALTIME] at the leap second edge 2015-06-12 11:15:49 +02:00
ntp_internal.h time: Prevent early expiry of hrtimers[CLOCK_REALTIME] at the leap second edge 2015-06-12 11:15:49 +02:00
posix-clock.c
posix-cpu-timers.c all arches, signal: move restart_block to struct task_struct 2015-02-12 18:54:12 -08:00
posix-timers.c hrtimer: Get rid of hrtimer_get_res() 2015-04-22 17:06:49 +02:00
sched_clock.c timers, sched/clock: Clean up the code a bit 2015-03-27 08:34:01 +01:00
test_udelay.c
tick-broadcast-hrtimer.c tick: hrtimer-broadcast: Prevent endless restarting when broadcast device is unused 2015-05-05 15:34:21 +02:00
tick-broadcast.c clockevents: Provide functions to set and get the state 2015-06-02 14:40:47 +02:00
tick-common.c clockevents: Use set/get state helper functions 2015-06-02 14:40:48 +02:00
tick-internal.h clockevents: Rename state to state_use_accessors 2015-06-02 16:56:42 +02:00
tick-oneshot.c clockevents: Provide functions to set and get the state 2015-06-02 14:40:47 +02:00
tick-sched.c nohz: Fix !HIGH_RES_TIMERS hang 2015-05-07 16:15:50 +02:00
tick-sched.h tick: Nohz: Rework next timer evaluation 2015-04-22 17:06:50 +02:00
time.c time: Refactor usecs_to_jiffies 2015-06-10 11:31:13 +02:00
timeconst.bc time: Move timeconst.h into include/generated 2015-05-19 15:13:45 +02:00
timeconv.c
timecounter.c
timekeeping.c time: Prevent early expiry of hrtimers[CLOCK_REALTIME] at the leap second edge 2015-06-12 11:15:49 +02:00
timekeeping.h hrtimer: Make offset update smarter 2015-04-22 17:06:49 +02:00
timekeeping_debug.c
timekeeping_internal.h
timer.c tracing: timer: Add deferrable flag to timer_start 2015-05-22 10:36:06 -07:00
timer_list.c clockevents: Introduce CLOCK_EVT_STATE_ONESHOT_STOPPED state 2015-05-19 16:18:02 +02:00
timer_stats.c