Since sched_clock always get stopped during suspend period, it would make it hard to use the kernel log to compare with other procssor generated log which running over the same machine. [Absolutely not running linux]
So we need a way to recover the printk timestamp that including suspend time in the old way, get_monotonic_boottime is a good candidate, but it cannot be called after suspend process has happen. Thus, it prevent printk to be used in every corner. Export one warn less __get_monotonic_boottime to solve this issue. Signed-off-by: Lei Wen <lei...@marvell.com> --- include/linux/time.h | 1 + kernel/time/timekeeping.c | 33 ++++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/include/linux/time.h b/include/linux/time.h index d5d229b..a2f5079 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -171,6 +171,7 @@ extern void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real); extern void getboottime(struct timespec *ts); extern void monotonic_to_bootbased(struct timespec *ts); +extern int __get_monotonic_boottime(struct timespec *ts); extern void get_monotonic_boottime(struct timespec *ts); extern struct timespec timespec_trunc(struct timespec t, unsigned gran); diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 5b40279..c196111 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -1465,23 +1465,22 @@ void getboottime(struct timespec *ts) EXPORT_SYMBOL_GPL(getboottime); /** - * get_monotonic_boottime - Returns monotonic time since boot + * __get_monotonic_boottime - Returns monotonic time since boot * @ts: pointer to the timespec to be set * - * Returns the monotonic time since boot in a timespec. + * Update the monotonic time since boot in a timespec. + * Returns 0 on success, or -ve when suspended (timespec will be undefined). * * This is similar to CLOCK_MONTONIC/ktime_get_ts, but also * includes the time spent in suspend. */ -void get_monotonic_boottime(struct timespec *ts) +int __get_monotonic_boottime(struct timespec *ts) { struct timekeeper *tk = &timekeeper; struct timespec tomono, sleep; s64 nsec; unsigned int seq; - WARN_ON(timekeeping_suspended); - do { seq = read_seqcount_begin(&timekeeper_seq); ts->tv_sec = tk->xtime_sec; @@ -1494,6 +1493,30 @@ void get_monotonic_boottime(struct timespec *ts) ts->tv_sec += tomono.tv_sec + sleep.tv_sec; ts->tv_nsec = 0; timespec_add_ns(ts, nsec + tomono.tv_nsec + sleep.tv_nsec); + + /* + * Do not bail out early, in case there were callers still using + * the value, even in the face of the WARN_ON. + */ + if (unlikely(timekeeping_suspended)) + return -EAGAIN; + return 0; +} +EXPORT_SYMBOL_GPL(__get_monotonic_boottime); + +/** + * get_monotonic_boottime - Returns monotonic time since boot + * @ts: pointer to the timespec to be set + * + * Returns the monotonic time since boot in a timespec. + * (WARN if suspended) + * + * This is similar to CLOCK_MONTONIC/ktime_get_ts, but also + * includes the time spent in suspend. + */ +void get_monotonic_boottime(struct timespec *ts) +{ + WARN_ON(__get_monotonic_boottime(ts)); } EXPORT_SYMBOL_GPL(get_monotonic_boottime); -- 1.8.3.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/