lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 4 Apr 2014 11:18:40 +0800 From: Lei Wen <leiwen@...vell.com> To: John Stultz <john.stultz@...aro.org>, Thomas Gleixner <tglx@...utronix.de>, Stephen Boyd <sboyd@...eaurora.org>, Andrew Morton <akpm@...ux-foundation.org>, Steven Rostedt <rostedt@...dmis.org>, Michael Opdenacker <michael.opdenacker@...e-electrons.com>, Joe Perches <joe@...ches.com>, Tejun Heo <tj@...nel.org>, Petr Mladek <pmladek@...e.cz>, <linux-kernel@...r.kernel.org>, <leiwen@...vell.com> Subject: [PATCH 1/3] time: create __get_monotonic_boottime for WARNless calls 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 <leiwen@...vell.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 majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists