diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-30 11:15:40 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-30 11:15:40 -0400 |
| commit | ab86e974f04b1cd827a9c7c35273834ebcd9ab38 (patch) | |
| tree | 41df33732d2700d6d57d1e7ab3f430942f09ffcc /include | |
| parent | 8700c95adb033843fc163d112b9d21d4fda78018 (diff) | |
| parent | 6f7a05d7018de222e40ca003721037a530979974 (diff) | |
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull core timer updates from Ingo Molnar:
"The main changes in this cycle's merge are:
- Implement shadow timekeeper to shorten in kernel reader side
blocking, by Thomas Gleixner.
- Posix timers enhancements by Pavel Emelyanov:
- allocate timer ID per process, so that exact timer ID allocations
can be re-created be checkpoint/restore code.
- debuggability and tooling (/proc/PID/timers, etc.) improvements.
- suspend/resume enhancements by Feng Tang: on certain new Intel Atom
processors (Penwell and Cloverview), there is a feature that the
TSC won't stop in S3 state, so the TSC value won't be reset to 0
after resume. This can be taken advantage of by the generic via
the CLOCK_SOURCE_SUSPEND_NONSTOP flag: instead of using the RTC to
recover/approximate sleep time, the main (and precise) clocksource
can be used.
- Fix /proc/timer_list for 4096 CPUs by Nathan Zimmer: on so many
CPUs the file goes beyond 4MB of size and thus the current
simplistic seqfile approach fails. Convert /proc/timer_list to a
proper seq_file with its own iterator.
- Cleanups and refactorings of the core timekeeping code by John
Stultz.
- International Atomic Clock time is managed by the NTP code
internally currently but not exposed externally. Separate the TAI
code out and add CLOCK_TAI support and TAI support to the hrtimer
and posix-timer code, by John Stultz.
- Add deep idle support enhacement to the broadcast clockevents core
timer code, by Daniel Lezcano: add an opt-in CLOCK_EVT_FEAT_DYNIRQ
clockevents feature (which will be utilized by future clockevents
driver updates), which allows the use of IRQ affinities to avoid
spurious wakeups of idle CPUs - the right CPU with an expiring
timer will be woken.
- Add new ARM bcm281xx clocksource driver, by Christian Daudt
- ... various other fixes and cleanups"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (52 commits)
clockevents: Set dummy handler on CPU_DEAD shutdown
timekeeping: Update tk->cycle_last in resume
posix-timers: Remove unused variable
clockevents: Switch into oneshot mode even if broadcast registered late
timer_list: Convert timer list to be a proper seq_file
timer_list: Split timer_list_show_tickdevices
posix-timers: Show sigevent info in proc file
posix-timers: Introduce /proc/PID/timers file
posix timers: Allocate timer id per process (v2)
timekeeping: Make sure to notify hrtimers when TAI offset changes
hrtimer: Fix ktime_add_ns() overflow on 32bit architectures
hrtimer: Add expiry time overflow check in hrtimer_interrupt
timekeeping: Shorten seq_count region
timekeeping: Implement a shadow timekeeper
timekeeping: Delay update of clock->cycle_last
timekeeping: Store cycle_last value in timekeeper struct as well
ntp: Remove ntp_lock, using the timekeeping locks to protect ntp state
timekeeping: Simplify tai updating from do_adjtimex
timekeeping: Hold timekeepering locks in do_adjtimex and hardpps
timekeeping: Move ADJ_SETOFFSET to top level do_adjtimex()
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/clockchips.h | 12 | ||||
| -rw-r--r-- | include/linux/clocksource.h | 1 | ||||
| -rw-r--r-- | include/linux/hrtimer.h | 5 | ||||
| -rw-r--r-- | include/linux/jiffies.h | 1 | ||||
| -rw-r--r-- | include/linux/posix-timers.h | 1 | ||||
| -rw-r--r-- | include/linux/sched.h | 3 | ||||
| -rw-r--r-- | include/linux/time.h | 3 | ||||
| -rw-r--r-- | include/linux/timekeeper_internal.h | 9 | ||||
| -rw-r--r-- | include/linux/timex.h | 7 | ||||
| -rw-r--r-- | include/uapi/linux/time.h | 6 |
10 files changed, 32 insertions, 16 deletions
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 66346521cb65..464e229e7d84 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h | |||
| @@ -55,6 +55,11 @@ enum clock_event_nofitiers { | |||
| 55 | #define CLOCK_EVT_FEAT_C3STOP 0x000008 | 55 | #define CLOCK_EVT_FEAT_C3STOP 0x000008 |
| 56 | #define CLOCK_EVT_FEAT_DUMMY 0x000010 | 56 | #define CLOCK_EVT_FEAT_DUMMY 0x000010 |
| 57 | 57 | ||
| 58 | /* | ||
| 59 | * Core shall set the interrupt affinity dynamically in broadcast mode | ||
| 60 | */ | ||
| 61 | #define CLOCK_EVT_FEAT_DYNIRQ 0x000020 | ||
| 62 | |||
| 58 | /** | 63 | /** |
| 59 | * struct clock_event_device - clock event device descriptor | 64 | * struct clock_event_device - clock event device descriptor |
| 60 | * @event_handler: Assigned by the framework to be called by the low | 65 | * @event_handler: Assigned by the framework to be called by the low |
| @@ -170,6 +175,12 @@ extern void tick_broadcast(const struct cpumask *mask); | |||
| 170 | extern int tick_receive_broadcast(void); | 175 | extern int tick_receive_broadcast(void); |
| 171 | #endif | 176 | #endif |
| 172 | 177 | ||
| 178 | #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT) | ||
| 179 | extern int tick_check_broadcast_expired(void); | ||
| 180 | #else | ||
| 181 | static inline int tick_check_broadcast_expired(void) { return 0; } | ||
| 182 | #endif | ||
| 183 | |||
| 173 | #ifdef CONFIG_GENERIC_CLOCKEVENTS | 184 | #ifdef CONFIG_GENERIC_CLOCKEVENTS |
| 174 | extern void clockevents_notify(unsigned long reason, void *arg); | 185 | extern void clockevents_notify(unsigned long reason, void *arg); |
| 175 | #else | 186 | #else |
| @@ -182,6 +193,7 @@ static inline void clockevents_suspend(void) {} | |||
| 182 | static inline void clockevents_resume(void) {} | 193 | static inline void clockevents_resume(void) {} |
| 183 | 194 | ||
| 184 | #define clockevents_notify(reason, arg) do { } while (0) | 195 | #define clockevents_notify(reason, arg) do { } while (0) |
| 196 | static inline int tick_check_broadcast_expired(void) { return 0; } | ||
| 185 | 197 | ||
| 186 | #endif | 198 | #endif |
| 187 | 199 | ||
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 27cfda427dd9..aa7032c7238f 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
| @@ -206,6 +206,7 @@ struct clocksource { | |||
| 206 | #define CLOCK_SOURCE_WATCHDOG 0x10 | 206 | #define CLOCK_SOURCE_WATCHDOG 0x10 |
| 207 | #define CLOCK_SOURCE_VALID_FOR_HRES 0x20 | 207 | #define CLOCK_SOURCE_VALID_FOR_HRES 0x20 |
| 208 | #define CLOCK_SOURCE_UNSTABLE 0x40 | 208 | #define CLOCK_SOURCE_UNSTABLE 0x40 |
| 209 | #define CLOCK_SOURCE_SUSPEND_NONSTOP 0x80 | ||
| 209 | 210 | ||
| 210 | /* simplify initialization of mask field */ | 211 | /* simplify initialization of mask field */ |
| 211 | #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) | 212 | #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) |
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index cc07d2777bbe..d19a5c2d2270 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
| @@ -157,6 +157,7 @@ enum hrtimer_base_type { | |||
| 157 | HRTIMER_BASE_MONOTONIC, | 157 | HRTIMER_BASE_MONOTONIC, |
| 158 | HRTIMER_BASE_REALTIME, | 158 | HRTIMER_BASE_REALTIME, |
| 159 | HRTIMER_BASE_BOOTTIME, | 159 | HRTIMER_BASE_BOOTTIME, |
| 160 | HRTIMER_BASE_TAI, | ||
| 160 | HRTIMER_MAX_CLOCK_BASES, | 161 | HRTIMER_MAX_CLOCK_BASES, |
| 161 | }; | 162 | }; |
| 162 | 163 | ||
| @@ -327,7 +328,9 @@ extern ktime_t ktime_get(void); | |||
| 327 | extern ktime_t ktime_get_real(void); | 328 | extern ktime_t ktime_get_real(void); |
| 328 | extern ktime_t ktime_get_boottime(void); | 329 | extern ktime_t ktime_get_boottime(void); |
| 329 | extern ktime_t ktime_get_monotonic_offset(void); | 330 | extern ktime_t ktime_get_monotonic_offset(void); |
| 330 | extern ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot); | 331 | extern ktime_t ktime_get_clocktai(void); |
| 332 | extern ktime_t ktime_get_update_offsets(ktime_t *offs_real, ktime_t *offs_boot, | ||
| 333 | ktime_t *offs_tai); | ||
| 331 | 334 | ||
| 332 | DECLARE_PER_CPU(struct tick_device, tick_cpu_device); | 335 | DECLARE_PER_CPU(struct tick_device, tick_cpu_device); |
| 333 | 336 | ||
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 82ed068b1ebe..8fb8edf12417 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h | |||
| @@ -75,7 +75,6 @@ extern int register_refined_jiffies(long clock_tick_rate); | |||
| 75 | */ | 75 | */ |
| 76 | extern u64 __jiffy_data jiffies_64; | 76 | extern u64 __jiffy_data jiffies_64; |
| 77 | extern unsigned long volatile __jiffy_data jiffies; | 77 | extern unsigned long volatile __jiffy_data jiffies; |
| 78 | extern seqlock_t jiffies_lock; | ||
| 79 | 78 | ||
| 80 | #if (BITS_PER_LONG < 64) | 79 | #if (BITS_PER_LONG < 64) |
| 81 | u64 get_jiffies_64(void); | 80 | u64 get_jiffies_64(void); |
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 042058fdb0af..60bac697a91b 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h | |||
| @@ -55,6 +55,7 @@ struct cpu_timer_list { | |||
| 55 | /* POSIX.1b interval timer structure. */ | 55 | /* POSIX.1b interval timer structure. */ |
| 56 | struct k_itimer { | 56 | struct k_itimer { |
| 57 | struct list_head list; /* free/ allocate list */ | 57 | struct list_head list; /* free/ allocate list */ |
| 58 | struct hlist_node t_hash; | ||
| 58 | spinlock_t it_lock; | 59 | spinlock_t it_lock; |
| 59 | clockid_t it_clock; /* which timer type */ | 60 | clockid_t it_clock; /* which timer type */ |
| 60 | timer_t it_id; /* timer id */ | 61 | timer_t it_id; /* timer id */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 981ab6887259..54ddcb82cddf 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -514,7 +514,8 @@ struct signal_struct { | |||
| 514 | unsigned int has_child_subreaper:1; | 514 | unsigned int has_child_subreaper:1; |
| 515 | 515 | ||
| 516 | /* POSIX.1b Interval Timers */ | 516 | /* POSIX.1b Interval Timers */ |
| 517 | struct list_head posix_timers; | 517 | int posix_timer_id; |
| 518 | struct list_head posix_timers; | ||
| 518 | 519 | ||
| 519 | /* ITIMER_REAL timer for the process */ | 520 | /* ITIMER_REAL timer for the process */ |
| 520 | struct hrtimer real_timer; | 521 | struct hrtimer real_timer; |
diff --git a/include/linux/time.h b/include/linux/time.h index d4835dfdf25e..22d81b3c955b 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
| @@ -181,6 +181,9 @@ extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | |||
| 181 | extern int timekeeping_valid_for_hres(void); | 181 | extern int timekeeping_valid_for_hres(void); |
| 182 | extern u64 timekeeping_max_deferment(void); | 182 | extern u64 timekeeping_max_deferment(void); |
| 183 | extern int timekeeping_inject_offset(struct timespec *ts); | 183 | extern int timekeeping_inject_offset(struct timespec *ts); |
| 184 | extern s32 timekeeping_get_tai_offset(void); | ||
| 185 | extern void timekeeping_set_tai_offset(s32 tai_offset); | ||
| 186 | extern void timekeeping_clocktai(struct timespec *ts); | ||
| 184 | 187 | ||
| 185 | struct tms; | 188 | struct tms; |
| 186 | extern void do_sys_times(struct tms *); | 189 | extern void do_sys_times(struct tms *); |
diff --git a/include/linux/timekeeper_internal.h b/include/linux/timekeeper_internal.h index e1d558e237ec..c1825eb436ed 100644 --- a/include/linux/timekeeper_internal.h +++ b/include/linux/timekeeper_internal.h | |||
| @@ -20,6 +20,8 @@ struct timekeeper { | |||
| 20 | u32 shift; | 20 | u32 shift; |
| 21 | /* Number of clock cycles in one NTP interval. */ | 21 | /* Number of clock cycles in one NTP interval. */ |
| 22 | cycle_t cycle_interval; | 22 | cycle_t cycle_interval; |
| 23 | /* Last cycle value (also stored in clock->cycle_last) */ | ||
| 24 | cycle_t cycle_last; | ||
| 23 | /* Number of clock shifted nano seconds in one NTP interval. */ | 25 | /* Number of clock shifted nano seconds in one NTP interval. */ |
| 24 | u64 xtime_interval; | 26 | u64 xtime_interval; |
| 25 | /* shifted nano seconds left over when rounding cycle_interval */ | 27 | /* shifted nano seconds left over when rounding cycle_interval */ |
| @@ -62,8 +64,11 @@ struct timekeeper { | |||
| 62 | ktime_t offs_boot; | 64 | ktime_t offs_boot; |
| 63 | /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ | 65 | /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ |
| 64 | struct timespec raw_time; | 66 | struct timespec raw_time; |
| 65 | /* Seqlock for all timekeeper values */ | 67 | /* The current UTC to TAI offset in seconds */ |
| 66 | seqlock_t lock; | 68 | s32 tai_offset; |
| 69 | /* Offset clock monotonic -> clock tai */ | ||
| 70 | ktime_t offs_tai; | ||
| 71 | |||
| 67 | }; | 72 | }; |
| 68 | 73 | ||
| 69 | static inline struct timespec tk_xtime(struct timekeeper *tk) | 74 | static inline struct timespec tk_xtime(struct timekeeper *tk) |
diff --git a/include/linux/timex.h b/include/linux/timex.h index 5ec87c60b97c..b3726e61368e 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
| @@ -125,9 +125,6 @@ | |||
| 125 | extern unsigned long tick_usec; /* USER_HZ period (usec) */ | 125 | extern unsigned long tick_usec; /* USER_HZ period (usec) */ |
| 126 | extern unsigned long tick_nsec; /* SHIFTED_HZ period (nsec) */ | 126 | extern unsigned long tick_nsec; /* SHIFTED_HZ period (nsec) */ |
| 127 | 127 | ||
| 128 | extern void ntp_init(void); | ||
| 129 | extern void ntp_clear(void); | ||
| 130 | |||
| 131 | /* Required to safely shift negative values */ | 128 | /* Required to safely shift negative values */ |
| 132 | #define shift_right(x, s) ({ \ | 129 | #define shift_right(x, s) ({ \ |
| 133 | __typeof__(x) __x = (x); \ | 130 | __typeof__(x) __x = (x); \ |
| @@ -140,10 +137,6 @@ extern void ntp_clear(void); | |||
| 140 | #define NTP_INTERVAL_FREQ (HZ) | 137 | #define NTP_INTERVAL_FREQ (HZ) |
| 141 | #define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ) | 138 | #define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ) |
| 142 | 139 | ||
| 143 | /* Returns how long ticks are at present, in ns / 2^NTP_SCALE_SHIFT. */ | ||
| 144 | extern u64 ntp_tick_length(void); | ||
| 145 | |||
| 146 | extern int second_overflow(unsigned long secs); | ||
| 147 | extern int do_adjtimex(struct timex *); | 140 | extern int do_adjtimex(struct timex *); |
| 148 | extern void hardpps(const struct timespec *, const struct timespec *); | 141 | extern void hardpps(const struct timespec *, const struct timespec *); |
| 149 | 142 | ||
diff --git a/include/uapi/linux/time.h b/include/uapi/linux/time.h index 0d3c0edc3eda..e75e1b6ff27f 100644 --- a/include/uapi/linux/time.h +++ b/include/uapi/linux/time.h | |||
| @@ -54,11 +54,9 @@ struct itimerval { | |||
| 54 | #define CLOCK_BOOTTIME 7 | 54 | #define CLOCK_BOOTTIME 7 |
| 55 | #define CLOCK_REALTIME_ALARM 8 | 55 | #define CLOCK_REALTIME_ALARM 8 |
| 56 | #define CLOCK_BOOTTIME_ALARM 9 | 56 | #define CLOCK_BOOTTIME_ALARM 9 |
| 57 | #define CLOCK_SGI_CYCLE 10 /* Hardware specific */ | ||
| 58 | #define CLOCK_TAI 11 | ||
| 57 | 59 | ||
| 58 | /* | ||
| 59 | * The IDs of various hardware clocks: | ||
| 60 | */ | ||
| 61 | #define CLOCK_SGI_CYCLE 10 | ||
| 62 | #define MAX_CLOCKS 16 | 60 | #define MAX_CLOCKS 16 |
| 63 | #define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC) | 61 | #define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC) |
| 64 | #define CLOCKS_MONO CLOCK_MONOTONIC | 62 | #define CLOCKS_MONO CLOCK_MONOTONIC |
