Timer updates for 3.4
Linus,
please pull the latest timers-core-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-core-for-linus
Thanks,
tglx
------------------>
Alok Kataria (1):
x86, tsc: Skip refined tsc calibration on systems with reliable TSC
Andy Lutomirski (2):
x86-64: Simplify and optimize vdso clock_gettime monotonic variants
x86-64: Inline vdso clock_gettime helpers
Cesar Eduardo Barros (1):
time: remove no_sync_cmos_clock
Jim Cromie (1):
kernel-time: fix s/then/than/ spelling errors
John Stultz (6):
time: x86: Fix race switching from vsyscall to non-vsyscall clock
time: Fix change_clocksource locking
rtc: Provide flag for rtc devices that don't support UIE
ntp: Fix leap-second hrtimer livelock
alarmtimer: Make sure we initialize the rtctimer
time: Avoid scary backtraces when warning of > 11% adj
Thomas Gleixner (7):
time: Remove bogus comments
x86: vdso: Remove bogus locking in update_vsyscall_tz()
x86: vdso: Use seqcount instead of seqlock
ia64: vsyscall: Use seqcount instead of seqlock
x86: vdso: Put declaration before code
alarmtimer: Don't call rtc_timer_init() when CONFIG_RTC_CLASS=n
ia64: vsyscall: Add missing paranthesis
arch/ia64/kernel/asm-offsets.c | 4 +- arch/ia64/kernel/fsys.S | 2 +- arch/ia64/kernel/fsyscall_gtod_data.h | 2 +- arch/ia64/kernel/time.c | 10 +-- arch/x86/include/asm/vgtod.h | 17 +++-- arch/x86/kernel/tsc.c | 10 +++ arch/x86/kernel/vsyscall_64.c | 25 +++--- arch/x86/vdso/vclock_gettime.c | 135 ++++++++++++++++----------------- drivers/rtc/interface.c | 5 + drivers/rtc/rtc-mpc5121.c | 2 + include/linux/rtc.h | 3 +- include/linux/time.h | 1 - include/linux/timex.h | 2 +- kernel/time.c | 6 -- kernel/time/alarmtimer.c | 8 ++ kernel/time/clocksource.c | 2 +- kernel/time/ntp.c | 134 ++++++++++---------------------- kernel/time/timekeeping.c | 51 ++++++------ 18 files changed, 193 insertions(+), 226 deletions(-)
arch/ia64/kernel/asm-offsets.c +2 -2
@@ -269,8 +269,8 @@ void foo(void)BLANK ();/* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */ -DEFINE (IA64_GTOD_LOCK_OFFSET , - offsetof (struct fsyscall_gtod_data_t , lock)); +DEFINE (IA64_GTOD_SEQ_OFFSET , + offsetof (struct fsyscall_gtod_data_t , seq));DEFINE (IA64_GTOD_WALL_TIME_OFFSET , offsetof (struct fsyscall_gtod_data_t , wall_time)); DEFINE(IA64_GTOD_MONO_TIME_OFFSET,
arch/ia64/kernel/fsys.S +1 -1
@@ -174,7 +174,7 @@ ENTRY(fsys_set_tid_address) FSYS_RETURN END(fsys_set_tid_address) -#if IA64_GTOD_LOCK_OFFSET !=0 +#if IA64_GTOD_SEQ_OFFSET !=0 #error fsys_gettimeofday incompatible with changes to struct fsyscall_gtod_data_t #endif #if IA64_ITC_JITTER_OFFSET !=0
arch/ia64/kernel/fsyscall_gtod_data.h +1 -1
@@ -6,7 +6,7 @@*/ struct fsyscall_gtod_data_t { -seqlock_t lock; +seqcount_t seq;struct timespec wall_time;struct timespec monotonic_time;cycle_t clk_mask;
arch/ia64/kernel/time.c +3 -7
@@ -35,9 +35,7 @@static cycle_t itc_get_cycles (struct clocksource *cs); -struct fsyscall_gtod_data_t fsyscall_gtod_data = { - .lock =__SEQLOCK_UNLOCKED (fsyscall_gtod_data.lock), -}; +struct fsyscall_gtod_data_t fsyscall_gtod_data;struct itc_jitter_data_t itc_jitter_data;
@@ -460,9 +458,7 @@ void update_vsyscall_tz(void)void update_vsyscall (struct timespec *wall,struct timespec *wtm,struct clocksource *c,u32 mult) { -unsigned long flags; - -write_seqlock_irqsave (&fsyscall_gtod_data.lock, flags); +write_seqcount_begin (&fsyscall_gtod_data.seq);/* copy fsyscall clock data */ fsyscall_gtod_data.clk_mask = c->mask;
@@ -485,6 +481,6 @@ void update_vsyscall(struct timespec *wall, struct timespec *wtm, fsyscall_gtod_data.monotonic_time.tv_sec++; } -write_sequnlock_irqrestore (&fsyscall_gtod_data.lock, flags); +write_seqcount_end (&fsyscall_gtod_data.seq); }
arch/x86/include/asm/vgtod.h +10 -7
@@ -5,13 +5,8 @@#include <linux/clocksource.h> struct vsyscall_gtod_data { -seqlock_t lock; +seqcount_t seq; -/* open coded 'struct timespec' */ -time_t wall_time_sec; -u32 wall_time_nsec; - -struct timezone sys_tz;struct {/* extract of a clocksource struct */ int vclock_mode;cycle_t cycle_last;
@@ -19,8 +14,16 @@ struct vsyscall_gtod_data {u32 mult;u32 shift; } clock; -struct timespec wall_to_monotonic; + +/* open coded 'struct timespec' */ +time_t wall_time_sec; +u32 wall_time_nsec; +u32 monotonic_time_nsec; +time_t monotonic_time_sec; + +struct timezone sys_tz;struct timespec wall_time_coarse; +struct timespec monotonic_time_coarse; };extern struct vsyscall_gtod_data vsyscall_gtod_data;
arch/x86/kernel/tsc.c +10 -0
@@ -932,6 +932,16 @@ static int __init init_tsc_clocksource(void) clocksource_tsc.rating =0 ; clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS ; } + +/* +* Trust the results of the earlier calibration on systems +* exporting a reliable TSC. +*/ +if (boot_cpu_has (X86_FEATURE_TSC_RELIABLE )) { +clocksource_register_khz (&clocksource_tsc, tsc_khz); +return 0 ; + } +schedule_delayed_work (&tsc_irqwork,0 );return 0 ; }
arch/x86/kernel/vsyscall_64.c +12 -13
@@ -52,10 +52,7 @@#include "vsyscall_trace.h" DEFINE_VVAR (int, vgetcpu_mode); -DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data) = -{ - .lock =__SEQLOCK_UNLOCKED (__vsyscall_gtod_data.lock), -}; +DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data);static enum {EMULATE ,NATIVE ,NONE } vsyscall_mode =EMULATE ;
@@ -80,20 +77,15 @@ early_param("vsyscall", vsyscall_setup);void update_vsyscall_tz (void ) { -unsigned long flags; - -write_seqlock_irqsave (&vsyscall_gtod_data.lock, flags); -/* sys_tz has changed */ vsyscall_gtod_data.sys_tz = sys_tz; -write_sequnlock_irqrestore (&vsyscall_gtod_data.lock, flags); }void update_vsyscall (struct timespec *wall_time,struct timespec *wtm,struct clocksource *clock,u32 mult) { -unsigned long flags; +struct timespec monotonic; -write_seqlock_irqsave (&vsyscall_gtod_data.lock, flags); +write_seqcount_begin (&vsyscall_gtod_data.seq);/* copy vsyscall data */ vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode;
@@ -101,12 +93,19 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm, vsyscall_gtod_data.clock.mask = clock->mask; vsyscall_gtod_data.clock.mult = mult; vsyscall_gtod_data.clock.shift = clock->shift; + vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec; vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec; - vsyscall_gtod_data.wall_to_monotonic = *wtm; + + monotonic =timespec_add (*wall_time, *wtm); + vsyscall_gtod_data.monotonic_time_sec = monotonic.tv_sec; + vsyscall_gtod_data.monotonic_time_nsec = monotonic.tv_nsec; + vsyscall_gtod_data.wall_time_coarse =__current_kernel_time (); + vsyscall_gtod_data.monotonic_time_coarse = +timespec_add (vsyscall_gtod_data.wall_time_coarse, *wtm); -write_sequnlock_irqrestore (&vsyscall_gtod_data.lock, flags); +write_seqcount_end (&vsyscall_gtod_data.seq); } static void warn_bad_vsyscall(const char *level, struct pt_regs *regs,
arch/x86/vdso/vclock_gettime.c +67 -68
199 lines not on this page · raw message
drivers/rtc/interface.c +5 -0
@@ -458,6 +458,11 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)if (rtc->uie_rtctimer.enabled == enabled) goto out; +if (rtc->uie_unsupported) { + err = -EINVAL ; + goto out; + } +if (enabled) {struct rtc_time tm;ktime_t now, onesec;
drivers/rtc/rtc-mpc5121.c +2 -0
@@ -360,6 +360,8 @@ static int __devinit mpc5121_rtc_probe(struct platform_device *op) &mpc5200_rtc_ops, THIS_MODULE); } + rtc->rtc->uie_unsupported =1 ; +if (IS_ERR (rtc->rtc)) { err =PTR_ERR (rtc->rtc); goto out_free_irq;
include/linux/rtc.h +2 -1
@@ -202,7 +202,8 @@ struct rtc_devicestruct hrtimer pie_timer;/* sub second exp, so needs hrtimer */ int pie_enabled;struct work_struct irqwork; - +/* Some hardware can't support UIE mode */ +int uie_unsupported;#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL struct work_struct uie_task;
include/linux/time.h +0 -1
@@ -116,7 +116,6 @@ static inline struct timespec timespec_sub(struct timespec lhs,extern void read_persistent_clock (struct timespec *ts);extern void read_boot_clock (struct timespec *ts);extern int update_persistent_clock (struct timespec now); -extern int no_sync_cmos_clock__read_mostly ;void timekeeping_init (void );extern int timekeeping_suspended;
include/linux/timex.h +1 -1
@@ -252,7 +252,7 @@ extern void ntp_clear(void);/* Returns how long ticks are at present, in ns / 2^NTP_SCALE_SHIFT. */ extern u64 ntp_tick_length (void ); -extern void second_overflow (void ); +extern int second_overflow (unsigned long secs);extern int do_adjtimex (struct timex *);extern void hardpps (const struct timespec *,const struct timespec *);
kernel/time.c +0 -6
@@ -163,7 +163,6 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)return error;if (tz) { -/* SMP safe, global irq locking makes it work. */ sys_tz = *tz;update_vsyscall_tz ();if (firsttime) {
@@ -173,12 +172,7 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz) } }if (tv) - { -/* SMP safe, again the code in arch/foo/time.c should -* globally block out interrupts when it runs. -*/ return do_settimeofday (tv); - }return 0 ; }
kernel/time/alarmtimer.c +8 -0
@@ -96,6 +96,11 @@ static int alarmtimer_rtc_add_device(struct device *dev,return 0 ; } +static inline void alarmtimer_rtc_timer_init (void ) +{ +rtc_timer_init (&rtctimer,NULL ,NULL ); +} +static struct class_interface alarmtimer_rtc_interface = { .add_dev = &alarmtimer_rtc_add_device, };
@@ -117,6 +122,7 @@ static inline struct rtc_device *alarmtimer_get_rtcdev(void)#define rtcdev (NULL)static inline int alarmtimer_rtc_interface_setup (void ) {return 0 ; }static inline void alarmtimer_rtc_interface_remove (void ) { } +static inline void alarmtimer_rtc_timer_init (void ) { }#endif /**
@@ -783,6 +789,8 @@ static int __init alarmtimer_init(void) .nsleep = alarm_timer_nsleep, }; +alarmtimer_rtc_timer_init (); +posix_timers_register_clock (CLOCK_REALTIME_ALARM , &alarm_clock);posix_timers_register_clock (CLOCK_BOOTTIME_ALARM , &alarm_clock);
kernel/time/clocksource.c +1 -1
@@ -500,7 +500,7 @@ static u32 clocksource_max_adjustment(struct clocksource *cs) {u64 ret;/* -* We won't try to correct for more then 11% adjustments (110,000 ppm), +* We won't try to correct for more than 11% adjustments (110,000 ppm), */ ret = (u64 )cs->mult *11 ;do_div (ret,100 );
kernel/time/ntp.c +42 -92
207 lines not on this page · raw message
kernel/time/timekeeping.c +26 -25
134 lines not on this page · raw message