timers/core changes for v3.8
Subsystems (3)
Ingo Molnar
maintainerLinus,
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
HEAD: 9c3f9e281697d02889c3b08922f3b30be75f56c2 Merge branch 'fortglx/3.8/time' of git://git.linaro.org/people/jstultz/linux into timers/core
It contains continued generic-NOHZ work by Frederic and smaller cleanups.
Thanks,
Ingo
------------------>
Chuansheng Liu (1):
tick: Correct the comments for tick_sched_timer()
Dan Carpenter (1):
clocksource: clean up parse_pmtmr()
Frederic Weisbecker (3):
tick: Consolidate timekeeping handling code
tick: Consolidate tick handling for high and low res handlers
tick: Conditionally build nohz specific code in tick handler
John Stultz (1):
time: Kill xtime_lock, replacing it with jiffies_lock
Lars-Peter Clausen (1):
time/jiffies: Make clocksource_jiffies static
Linus Walleij (1):
clocksource: arm_generic: use integer math helpers
Shan Wei (1):
clocksource: arm_generic: use this_cpu_ptr per-cpu helper
drivers/clocksource/acpi_pm.c | 17 +++-- drivers/clocksource/arm_generic.c | 6 +- drivers/clocksource/i8253.c | 2 +- include/linux/jiffies.h | 3 +- kernel/time/jiffies.c | 8 ++- kernel/time/tick-common.c | 8 +-- kernel/time/tick-internal.h | 1 - kernel/time/tick-sched.c | 133 +++++++++++++++++--------------------- kernel/time/timekeeping.c | 14 +--- 9 files changed, 85 insertions(+), 107 deletions(-)
drivers/clocksource/acpi_pm.c +8 -9
@@ -233,16 +233,15 @@ fs_initcall(init_acpi_pm_clocksource);*/ static int __init parse_pmtmr (char *arg) { -unsigned long base; +unsigned int base; +int ret; -if (strict_strtoul (arg,16 , &base)) -return -EINVAL ; -#ifdef CONFIG_X86_64 -if (base >UINT_MAX ) -return -ERANGE ; -#endif -printk (KERN_INFO "PMTMR IOPort override: 0x%04x -> 0x%04lx\n" , - pmtmr_ioport, base); + ret =kstrtouint (arg,16 , &base); +if (ret) +return ret; + +pr_info ("PMTMR IOPort override: 0x%04x -> 0x%04x\n" , pmtmr_ioport, + base); pmtmr_ioport = base;return 1 ;
drivers/clocksource/arm_generic.c +3 -3
@@ -127,7 +127,7 @@ static void __init arch_timer_calibrate(void)/* Cache the sched_clock multiplier to save a divide in the hot path. */ - sched_clock_mult =NSEC_PER_SEC / arch_timer_rate; + sched_clock_mult =DIV_ROUND_CLOSEST (NSEC_PER_SEC , arch_timer_rate);pr_info ("Architected local timer running at %u.%02uMHz.\n" , arch_timer_rate /1000000 , (arch_timer_rate /10000 ) %100 );
@@ -221,10 +221,10 @@ int __init arm_generic_timer_init(void)clocksource_register_hz (&clocksource_counter, arch_timer_rate);/* Calibrate the delay loop directly */ - lpj_fine = arch_timer_rate /HZ ; + lpj_fine =DIV_ROUND_CLOSEST (arch_timer_rate,HZ );/* Immediately configure the timer on the boot CPU */ -arch_timer_setup (per_cpu_ptr (&arch_timer_evt,smp_processor_id ())); +arch_timer_setup (this_cpu_ptr (&arch_timer_evt));register_cpu_notifier (&arch_timer_cpu_nb);
drivers/clocksource/i8253.c +1 -1
@@ -35,7 +35,7 @@ static cycle_t i8253_read(struct clocksource *cs)raw_spin_lock_irqsave (&i8253_lock, flags);/* -* Although our caller may have the read side of xtime_lock, +* Although our caller may have the read side of jiffies_lock, * this is now a seqlock, and we are cheating in this routine * by having side effects on state that we cannot undo if * there is a collision on the seqlock and our caller has to
include/linux/jiffies.h +2 -1
@@ -70,11 +70,12 @@ extern int register_refined_jiffies(long clock_tick_rate);/* * The 64-bit value is not atomic - you MUST NOT read it -* without sampling the sequence number in xtime_lock. +* without sampling the sequence number in jiffies_lock. * get_jiffies_64() will do this for you as appropriate. */ extern u64 __jiffy_data jiffies_64;extern unsigned long volatile __jiffy_data jiffies; +extern seqlock_t jiffies_lock;#if (BITS_PER_LONG <64 )u64 get_jiffies_64 (void );
kernel/time/jiffies.c +5 -3
@@ -58,7 +58,7 @@ static cycle_t jiffies_read(struct clocksource *cs)return (cycle_t ) jiffies; } -struct clocksource clocksource_jiffies = { +static struct clocksource clocksource_jiffies = { .name ="jiffies" , .rating =1 ,/* lowest valid rating*/ .read = jiffies_read,
@@ -67,6 +67,8 @@ struct clocksource clocksource_jiffies = { .shift = JIFFIES_SHIFT, }; +__cacheline_aligned_in_smp DEFINE_SEQLOCK (jiffies_lock ); +#if (BITS_PER_LONG <64 )u64 get_jiffies_64 (void ) {
@@ -74,9 +76,9 @@ u64 get_jiffies_64(void)u64 ret;do { - seq =read_seqbegin (&xtime_lock); + seq =read_seqbegin (&jiffies_lock); ret = jiffies_64; - }while (read_seqretry (&xtime_lock, seq)); + }while (read_seqretry (&jiffies_lock, seq));return ret; }EXPORT_SYMBOL (get_jiffies_64);
kernel/time/tick-common.c +4 -4
@@ -63,13 +63,13 @@ int tick_is_oneshot_available(void)static void tick_periodic (int cpu) {if (tick_do_timer_cpu == cpu) { -write_seqlock (&xtime_lock); +write_seqlock (&jiffies_lock);/* Keep track of the next tick event */ tick_next_period =ktime_add (tick_next_period, tick_period);do_timer (1 ); -write_sequnlock (&xtime_lock); +write_sequnlock (&jiffies_lock); }update_process_times (user_mode (get_irq_regs ()));
@@ -130,9 +130,9 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)ktime_t next;do { - seq =read_seqbegin (&xtime_lock); + seq =read_seqbegin (&jiffies_lock); next = tick_next_period; - }while (read_seqretry (&xtime_lock, seq)); + }while (read_seqretry (&jiffies_lock, seq));clockevents_set_mode (dev,CLOCK_EVT_MODE_ONESHOT );
kernel/time/tick-internal.h +0 -1
@@ -141,4 +141,3 @@ static inline int tick_device_is_functional(struct clock_event_device *dev)#endif extern void do_timer (unsigned long ticks); -extern seqlock_t xtime_lock;
kernel/time/tick-sched.c +59 -74
212 lines not on this page · raw message
kernel/time/timekeeping.c +3 -11
@@ -25,12 +25,6 @@static struct timekeeper timekeeper; -/* -* This read-write spinlock protects us from races in SMP while -* playing with xtime. -*/ -__cacheline_aligned_in_smp DEFINE_SEQLOCK (xtime_lock ); -/* flag for if timekeeping is suspended */ int __read_mostly timekeeping_suspended;
@@ -1299,9 +1293,7 @@ struct timespec get_monotonic_coarse(void) }/* -* The 64-bit jiffies value is not atomic - you MUST NOT read it -* without sampling the sequence number in xtime_lock. -* jiffies is defined in the linker script... +* Must hold jiffies_lock */ void do_timer (unsigned long ticks) {
@@ -1389,7 +1381,7 @@ EXPORT_SYMBOL_GPL(ktime_get_monotonic_offset);*/ void xtime_update (unsigned long ticks) { -write_seqlock (&xtime_lock); +write_seqlock (&jiffies_lock);do_timer (ticks); -write_sequnlock (&xtime_lock); +write_sequnlock (&jiffies_lock); }