aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/timekeeper_internal.h
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2014-07-16 17:05:16 -0400
committerJohn Stultz <john.stultz@linaro.org>2014-07-23 18:01:53 -0400
commitd28ede83791defee9a81e558540699dc46dbbe13 (patch)
tree40df9738db287097241fe25493df982ee33b046f /include/linux/timekeeper_internal.h
parent6d3aadf3e180e09dbefab16478c6876b584ce16e (diff)
timekeeping: Create struct tk_read_base and use it in struct timekeeper
The members of the new struct are the required ones for the new NMI safe accessor to clcok monotonic. In order to reuse the existing timekeeping code and to make the update of the fast NMI safe timekeepers a simple memcpy use the struct for the timekeeper as well and convert all users. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'include/linux/timekeeper_internal.h')
-rw-r--r--include/linux/timekeeper_internal.h103
1 files changed, 55 insertions, 48 deletions
diff --git a/include/linux/timekeeper_internal.h b/include/linux/timekeeper_internal.h
index 75bb8add78f5..97381997625b 100644
--- a/include/linux/timekeeper_internal.h
+++ b/include/linux/timekeeper_internal.h
@@ -10,80 +10,87 @@
10#include <linux/jiffies.h> 10#include <linux/jiffies.h>
11#include <linux/time.h> 11#include <linux/time.h>
12 12
13/* 13/**
14 * Structure holding internal timekeeping values. 14 * struct tk_read_base - base structure for timekeeping readout
15 * 15 * @clock: Current clocksource used for timekeeping.
16 * Note: wall_to_monotonic is what we need to add to xtime (or xtime 16 * @read: Read function of @clock
17 * corrected for sub jiffie times) to get to monotonic time. 17 * @mask: Bitmask for two's complement subtraction of non 64bit clocks
18 * Monotonic is pegged at zero at system boot time, so 18 * @cycle_last: @clock cycle value at last update
19 * wall_to_monotonic will be negative, however, we will ALWAYS keep 19 * @mult: NTP adjusted multiplier for scaled math conversion
20 * the tv_nsec part positive so we can use the usual normalization. 20 * @shift: Shift value for scaled math conversion
21 * @xtime_nsec: Shifted (fractional) nano seconds offset for readout
22 * @base_mono: ktime_t (nanoseconds) base time for readout
21 * 23 *
22 * wall_to_monotonic is moved after resume from suspend for the 24 * This struct has size 56 byte on 64 bit. Together with a seqcount it
23 * monotonic time not to jump. To calculate the real boot time offset 25 * occupies a single 64byte cache line.
24 * we need to do offs_real - offs_boot.
25 * 26 *
26 * - wall_to_monotonic is no longer the boot time, getboottime must be 27 * The struct is separate from struct timekeeper as it is also used
27 * used instead. 28 * for a fast NMI safe accessor to clock monotonic.
28 */ 29 */
29struct timekeeper { 30struct tk_read_base {
30 /* Current clocksource used for timekeeping. */
31 struct clocksource *clock; 31 struct clocksource *clock;
32 /* Read function of @clock */
33 cycle_t (*read)(struct clocksource *cs); 32 cycle_t (*read)(struct clocksource *cs);
34 /* Bitmask for two's complement subtraction of non 64bit counters */
35 cycle_t mask; 33 cycle_t mask;
36 /* Last cycle value */
37 cycle_t cycle_last; 34 cycle_t cycle_last;
38 /* NTP adjusted clock multiplier */
39 u32 mult; 35 u32 mult;
40 /* The shift value of the current clocksource. */
41 u32 shift; 36 u32 shift;
42 /* Clock shifted nano seconds */
43 u64 xtime_nsec; 37 u64 xtime_nsec;
44
45 /* Monotonic base time */
46 ktime_t base_mono; 38 ktime_t base_mono;
39};
47 40
48 /* Current CLOCK_REALTIME time in seconds */ 41/**
42 * struct timekeeper - Structure holding internal timekeeping values.
43 * @tkr: The readout base structure
44 * @xtime_sec: Current CLOCK_REALTIME time in seconds
45 * @wall_to_monotonic: CLOCK_REALTIME to CLOCK_MONOTONIC offset
46 * @offs_real: Offset clock monotonic -> clock realtime
47 * @offs_boot: Offset clock monotonic -> clock boottime
48 * @offs_tai: Offset clock monotonic -> clock tai
49 * @tai_offset: The current UTC to TAI offset in seconds
50 * @base_raw: Monotonic raw base time in ktime_t format
51 * @raw_time: Monotonic raw base time in timespec64 format
52 * @cycle_interval: Number of clock cycles in one NTP interval
53 * @xtime_interval: Number of clock shifted nano seconds in one NTP
54 * interval.
55 * @xtime_remainder: Shifted nano seconds left over when rounding
56 * @cycle_interval
57 * @raw_interval: Raw nano seconds accumulated per NTP interval.
58 * @ntp_error: Difference between accumulated time and NTP time in ntp
59 * shifted nano seconds.
60 * @ntp_error_shift: Shift conversion between clock shifted nano seconds and
61 * ntp shifted nano seconds.
62 *
63 * Note: For timespec(64) based interfaces wall_to_monotonic is what
64 * we need to add to xtime (or xtime corrected for sub jiffie times)
65 * to get to monotonic time. Monotonic is pegged at zero at system
66 * boot time, so wall_to_monotonic will be negative, however, we will
67 * ALWAYS keep the tv_nsec part positive so we can use the usual
68 * normalization.
69 *
70 * wall_to_monotonic is moved after resume from suspend for the
71 * monotonic time not to jump. We need to add total_sleep_time to
72 * wall_to_monotonic to get the real boot based time offset.
73 *
74 * wall_to_monotonic is no longer the boot time, getboottime must be
75 * used instead.
76 */
77struct timekeeper {
78 struct tk_read_base tkr;
49 u64 xtime_sec; 79 u64 xtime_sec;
50 /* CLOCK_REALTIME to CLOCK_MONOTONIC offset */
51 struct timespec64 wall_to_monotonic; 80 struct timespec64 wall_to_monotonic;
52
53 /* Offset clock monotonic -> clock realtime */
54 ktime_t offs_real; 81 ktime_t offs_real;
55 /* Offset clock monotonic -> clock boottime */
56 ktime_t offs_boot; 82 ktime_t offs_boot;
57 /* Offset clock monotonic -> clock tai */
58 ktime_t offs_tai; 83 ktime_t offs_tai;
59
60 /* The current UTC to TAI offset in seconds */
61 s32 tai_offset; 84 s32 tai_offset;
62
63 /* Monotonic raw base time */
64 ktime_t base_raw; 85 ktime_t base_raw;
65
66 /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */
67 struct timespec64 raw_time; 86 struct timespec64 raw_time;
68 87
69 /* Number of clock cycles in one NTP interval. */ 88 /* The following members are for timekeeping internal use */
70 cycle_t cycle_interval; 89 cycle_t cycle_interval;
71 /* Number of clock shifted nano seconds in one NTP interval. */
72 u64 xtime_interval; 90 u64 xtime_interval;
73 /* shifted nano seconds left over when rounding cycle_interval */
74 s64 xtime_remainder; 91 s64 xtime_remainder;
75 /* Raw nano seconds accumulated per NTP interval. */
76 u32 raw_interval; 92 u32 raw_interval;
77
78 /*
79 * Difference between accumulated time and NTP time in ntp
80 * shifted nano seconds.
81 */
82 s64 ntp_error; 93 s64 ntp_error;
83 /*
84 * Shift conversion between clock shifted nano seconds and
85 * ntp shifted nano seconds.
86 */
87 u32 ntp_error_shift; 94 u32 ntp_error_shift;
88}; 95};
89 96