diff options
Diffstat (limited to 'kernel/time/timekeeping.c')
-rw-r--r-- | kernel/time/timekeeping.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 91db94136c10..acf049144cf6 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -118,6 +118,31 @@ static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) | |||
118 | tk->offs_boot = ktime_add(tk->offs_boot, delta); | 118 | tk->offs_boot = ktime_add(tk->offs_boot, delta); |
119 | } | 119 | } |
120 | 120 | ||
121 | #ifdef CONFIG_DEBUG_TIMEKEEPING | ||
122 | static void timekeeping_check_update(struct timekeeper *tk, cycle_t offset) | ||
123 | { | ||
124 | |||
125 | cycle_t max_cycles = tk->tkr.clock->max_cycles; | ||
126 | const char *name = tk->tkr.clock->name; | ||
127 | |||
128 | if (offset > max_cycles) { | ||
129 | printk_deferred("WARNING: timekeeping: Cycle offset (%lld) is larger than allowed by the '%s' clock's max_cycles value (%lld): time overflow\n", | ||
130 | offset, name, max_cycles); | ||
131 | printk_deferred(" timekeeping: Your kernel is sick, but tries to cope\n"); | ||
132 | } else { | ||
133 | if (offset > (max_cycles >> 1)) { | ||
134 | printk_deferred("INFO: timekeeping: Cycle offset (%lld) is larger than the the '%s' clock's 50%% safety margin (%lld)\n", | ||
135 | offset, name, max_cycles >> 1); | ||
136 | printk_deferred(" timekeeping: Your kernel is still fine, but is feeling a bit nervous\n"); | ||
137 | } | ||
138 | } | ||
139 | } | ||
140 | #else | ||
141 | static inline void timekeeping_check_update(struct timekeeper *tk, cycle_t offset) | ||
142 | { | ||
143 | } | ||
144 | #endif | ||
145 | |||
121 | /** | 146 | /** |
122 | * tk_setup_internals - Set up internals to use clocksource clock. | 147 | * tk_setup_internals - Set up internals to use clocksource clock. |
123 | * | 148 | * |
@@ -1630,6 +1655,9 @@ void update_wall_time(void) | |||
1630 | if (offset < real_tk->cycle_interval) | 1655 | if (offset < real_tk->cycle_interval) |
1631 | goto out; | 1656 | goto out; |
1632 | 1657 | ||
1658 | /* Do some additional sanity checking */ | ||
1659 | timekeeping_check_update(real_tk, offset); | ||
1660 | |||
1633 | /* | 1661 | /* |
1634 | * With NO_HZ we may have to accumulate many cycle_intervals | 1662 | * With NO_HZ we may have to accumulate many cycle_intervals |
1635 | * (think "ticks") worth of time at once. To do this efficiently, | 1663 | * (think "ticks") worth of time at once. To do this efficiently, |