aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/time/timekeeping.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/time/timekeeping.c')
-rw-r--r--kernel/time/timekeeping.c28
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
122static 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
141static 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,