|
10 | 10 | #include <linux/jiffies.h> |
11 | 11 | #include <linux/time.h> |
12 | 12 |
|
13 | | -/* |
14 | | - * Structure holding internal timekeeping values. |
15 | | - * |
16 | | - * Note: wall_to_monotonic is what we need to add to xtime (or xtime |
17 | | - * corrected for sub jiffie times) to get to monotonic time. |
18 | | - * Monotonic is pegged at zero at system boot time, so |
19 | | - * wall_to_monotonic will be negative, however, we will ALWAYS keep |
20 | | - * the tv_nsec part positive so we can use the usual normalization. |
| 13 | +/** |
| 14 | + * struct tk_read_base - base structure for timekeeping readout |
| 15 | + * @clock: Current clocksource used for timekeeping. |
| 16 | + * @read: Read function of @clock |
| 17 | + * @mask: Bitmask for two's complement subtraction of non 64bit clocks |
| 18 | + * @cycle_last: @clock cycle value at last update |
| 19 | + * @mult: NTP adjusted multiplier for scaled math conversion |
| 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 |
23 | | - * monotonic time not to jump. To calculate the real boot time offset |
24 | | - * we need to do offs_real - offs_boot. |
| 24 | + * This struct has size 56 byte on 64 bit. Together with a seqcount it |
| 25 | + * occupies a single 64byte cache line. |
25 | 26 | * |
26 | | - * - wall_to_monotonic is no longer the boot time, getboottime must be |
27 | | - * used instead. |
| 27 | + * The struct is separate from struct timekeeper as it is also used |
| 28 | + * for a fast NMI safe accessor to clock monotonic. |
28 | 29 | */ |
29 | | -struct timekeeper { |
30 | | - /* Current clocksource used for timekeeping. */ |
| 30 | +struct tk_read_base { |
31 | 31 | struct clocksource *clock; |
32 | | - /* Read function of @clock */ |
33 | 32 | cycle_t (*read)(struct clocksource *cs); |
34 | | - /* Bitmask for two's complement subtraction of non 64bit counters */ |
35 | 33 | cycle_t mask; |
36 | | - /* Last cycle value */ |
37 | 34 | cycle_t cycle_last; |
38 | | - /* NTP adjusted clock multiplier */ |
39 | 35 | u32 mult; |
40 | | - /* The shift value of the current clocksource. */ |
41 | 36 | u32 shift; |
42 | | - /* Clock shifted nano seconds */ |
43 | 37 | u64 xtime_nsec; |
44 | | - |
45 | | - /* Monotonic base time */ |
46 | 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 | + */ |
| 77 | +struct timekeeper { |
| 78 | + struct tk_read_base tkr; |
49 | 79 | u64 xtime_sec; |
50 | | - /* CLOCK_REALTIME to CLOCK_MONOTONIC offset */ |
51 | 80 | struct timespec64 wall_to_monotonic; |
52 | | - |
53 | | - /* Offset clock monotonic -> clock realtime */ |
54 | 81 | ktime_t offs_real; |
55 | | - /* Offset clock monotonic -> clock boottime */ |
56 | 82 | ktime_t offs_boot; |
57 | | - /* Offset clock monotonic -> clock tai */ |
58 | 83 | ktime_t offs_tai; |
59 | | - |
60 | | - /* The current UTC to TAI offset in seconds */ |
61 | 84 | s32 tai_offset; |
62 | | - |
63 | | - /* Monotonic raw base time */ |
64 | 85 | ktime_t base_raw; |
65 | | - |
66 | | - /* The raw monotonic time for the CLOCK_MONOTONIC_RAW posix clock. */ |
67 | 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 | 89 | cycle_t cycle_interval; |
71 | | - /* Number of clock shifted nano seconds in one NTP interval. */ |
72 | 90 | u64 xtime_interval; |
73 | | - /* shifted nano seconds left over when rounding cycle_interval */ |
74 | 91 | s64 xtime_remainder; |
75 | | - /* Raw nano seconds accumulated per NTP interval. */ |
76 | 92 | u32 raw_interval; |
77 | | - |
78 | | - /* |
79 | | - * Difference between accumulated time and NTP time in ntp |
80 | | - * shifted nano seconds. |
81 | | - */ |
82 | 93 | s64 ntp_error; |
83 | | - /* |
84 | | - * Shift conversion between clock shifted nano seconds and |
85 | | - * ntp shifted nano seconds. |
86 | | - */ |
87 | 94 | u32 ntp_error_shift; |
88 | 95 | }; |
89 | 96 |
|
|
0 commit comments