Hi,

On 19/07/2017 at 12:44:41 -0700, Mark Salyzyn wrote:
> Primary purpose of rtc_show_time is to provide a marker used for
> post-mortem Battery and Power analysis.  These markers occur at
> major discontinuities of time, and thus optionally add a timestamp
> to aid the analysis.  This function is to be called at a higher
> level, and were added because of a lack of current kernel logging
> data.
> 

I really think you should drop rtc from the config, function and file
names because this doesn't have any relationship with any RTC stuff.

I can just see that you are (ab)using rtc_time64_to_tm because there is
no struct tm or gmtime() in the kernel.

> The persistent clock that is used to report Suspended for message
> is not present on all platforms, and is currently standardized for
> millisecond precision.
> 
> An added value to the time report is the ability in post-mortem
> triage analysis to synchronize kernel activities in MONOTONIC
> time with user space activities in REALTIME.
> 
> Feature activated by CONFIG_RTC_SHOW_TIME_<TYPE>, where <TYPE> is
> None (default, disabled), realtime, boottime or monotonic.
> 
> Since this is for post mortem field analysis, there is no debugfs
> or trace facility that can generally be leveraged.  analyze_suspend.py
> for example requires a debug configured kernel, on the other hand
> these prints can remain in a field product.  The purpose for
> rtc_show_time is not for development debugging.
> 
> Data collected may be recorded by klogd with a longer logspan
> than the built-in dmesg buffer, or land in pstore console driver
> to be collected after a reboot.
> 
> Signed-off-by: Mark Salyzyn <saly...@android.com>
> 
> v2:
> - move implementation to kernel timekeeping from rtc_lib files
> - use rtc_time64_to_tm() instead of rtc_time_to_tm()
> - use inline in include/linux/rtc.h for !CONFIG_RTC_SHOW_TIME
> v3:
> - _correctly_ use rtc_time64_to_tm
> v4:
> - introduce CONFIG_RTC_SHOW_TIME_<TYPE> and split off rtc time
>   format printing to a separate patch.
> 
> ---
>  include/linux/rtc.h         |  5 +++
>  kernel/time/Kconfig         | 77 
> +++++++++++++++++++++++++++++++++++++++++++++
>  kernel/time/Makefile        |  1 +
>  kernel/time/rtc_show_time.c | 29 +++++++++++++++++
>  4 files changed, 112 insertions(+)
>  create mode 100644 kernel/time/rtc_show_time.c
> 
> diff --git a/include/linux/rtc.h b/include/linux/rtc.h
> index 0a0f0d14a5fb..779401c937d5 100644
> --- a/include/linux/rtc.h
> +++ b/include/linux/rtc.h
> @@ -22,6 +22,11 @@ extern int rtc_year_days(unsigned int day, unsigned int 
> month, unsigned int year
>  extern int rtc_valid_tm(struct rtc_time *tm);
>  extern time64_t rtc_tm_to_time64(struct rtc_time *tm);
>  extern void rtc_time64_to_tm(time64_t time, struct rtc_time *tm);
> +#ifdef CONFIG_RTC_SHOW_TIME
> +extern void rtc_show_time(const char *prefix_msg);
> +#else
> +static inline void rtc_show_time(const char *prefix_msg) { }
> +#endif
>  ktime_t rtc_tm_to_ktime(struct rtc_time tm);
>  struct rtc_time rtc_ktime_to_tm(ktime_t kt);
>  
> diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig
> index ac09bc29eb08..2dc891056635 100644
> --- a/kernel/time/Kconfig
> +++ b/kernel/time/Kconfig
> @@ -145,3 +145,80 @@ config HIGH_RES_TIMERS
>  
>  endmenu
>  endif
> +
> +config RTC_SHOW_TIME
> +     bool
> +     help
> +       Activate optional rtc_show_time(const char *msg) wall clock
> +       time instrumentation.
> +
> +       The primary use of the instrumentation is to aid field
> +       analysis of Battery and Power usage.  The instrumentation
> +       may also help triage and synchronize kernel logs and user
> +       space activity logs at key displacements.  For instance
> +       CLOCK_MONOTONIC stops while suspended, while CLOCK_REALTIME
> +       continues, and the timestamps help re-orient post-analysis.
> +
> +       Select the appropriate RTC_SHOW_TIME_<type>
> +
> +choice
> +     prompt "choose a clock for rtc_show_time"
> +     config RTC_SHOW_TIME_NONE
> +             bool "not activated"
> +             help
> +               Turn off all printing associated with rtc_show_time
> +
> +               The primary use of the instrumentation is to aid field
> +               analysis of Battery and Power usage.  The instrumentation
> +               may also help triage and synchronize kernel logs and user
> +               space activity logs at key displacements.  For instance
> +               CLOCK_MONOTONIC stops while suspended, while CLOCK_REALTIME
> +               continues, and the timestamps help re-orient post-analysis.
> +
> +               This is the default behavior.
> +     config RTC_SHOW_TIME_REALTIME
> +             bool "realtime"
> +             select RTC_SHOW_TIME
> +             help
> +               Activate optional rtc_show_time(const char *msg) wall clock
> +               time instrumentation.
> +
> +               The primary use of the instrumentation is to aid field
> +               analysis of Battery and Power usage.  The instrumentation
> +               may also help triage and synchronize kernel logs and user
> +               space activity logs at key displacements.  For instance
> +               CLOCK_MONOTONIC stops while suspended, while CLOCK_REALTIME
> +               continues, and the timestamps help re-orient post-analysis.
> +
> +               Print realtime <epoch>.<ns> timestamp in rtc_show_time
> +     config RTC_SHOW_TIME_MONOTONIC
> +             bool "monotonic"
> +             select RTC_SHOW_TIME
> +             help
> +               Activate optional rtc_show_time(const char *msg) wall clock
> +               time instrumentation.
> +
> +               The primary use of the instrumentation is to aid field
> +               analysis of Battery and Power usage.  The instrumentation
> +               may also help triage and synchronize kernel logs and user
> +               space activity logs at key displacements.  For instance
> +               CLOCK_MONOTONIC stops while suspended, while CLOCK_REALTIME
> +               continues, and the timestamps help re-orient post-analysis.
> +
> +               Print only the supplied message in rtc_show_time
> +     config RTC_SHOW_TIME_BOOTTIME
> +             bool "boottime"
> +             select RTC_SHOW_TIME
> +             help
> +               Activate optional rtc_show_time(const char *msg) wall clock
> +               time instrumentation.
> +
> +               The primary use of the instrumentation is to aid field
> +               analysis of Battery and Power usage.  The instrumentation
> +               may also help triage and synchronize kernel logs and user
> +               space activity logs at key displacements.  For instance
> +               CLOCK_MONOTONIC stops while suspended, while CLOCK_REALTIME
> +               continues, and the timestamps help re-orient post-analysis.
> +
> +               Print boottime <s>.<ns> timestamp in rtc_show_time
> +endchoice
> diff --git a/kernel/time/Makefile b/kernel/time/Makefile
> index 938dbf33ef49..66f17e641052 100644
> --- a/kernel/time/Makefile
> +++ b/kernel/time/Makefile
> @@ -17,3 +17,4 @@ obj-$(CONFIG_GENERIC_SCHED_CLOCK)           += sched_clock.o
>  obj-$(CONFIG_TICK_ONESHOT)                   += tick-oneshot.o tick-sched.o
>  obj-$(CONFIG_DEBUG_FS)                               += timekeeping_debug.o
>  obj-$(CONFIG_TEST_UDELAY)                    += test_udelay.o
> +obj-$(CONFIG_RTC_SHOW_TIME)                  += rtc_show_time.o
> diff --git a/kernel/time/rtc_show_time.c b/kernel/time/rtc_show_time.c
> new file mode 100644
> index 000000000000..19a8a0cc94f0
> --- /dev/null
> +++ b/kernel/time/rtc_show_time.c
> @@ -0,0 +1,29 @@
> +/*
> + * rtc time printing utility functions
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/rtc.h>
> +
> +void rtc_show_time(const char *prefix_msg)
> +{
> +#if defined(CONFIG_RTC_SHOW_TIME_MONOTONIC) /* dmesg is in monotonic */
> +     pr_info("%s\n", prefix_msg ? prefix_msg : "Time:");
> +#elif defined(CONFIG_RTC_SHOW_TIME_BOOTTIME)
> +     struct timespec64 ts;
> +
> +     getboottime64(&ts);
> +     pr_info("%s %lu.%09lu B\n",
> +             prefix_msg ? prefix_msg : "Time:", ts.tv_sec, ts.tv_nsec);
> +#else /* realtime */
> +     struct timespec64 ts;
> +
> +     getnstimeofday64(&ts);
> +     pr_info("%s %lu.%09lu UTC\n",
> +             prefix_msg ? prefix_msg : "Time:", ts.tv_sec, ts.tv_nsec);
> +#endif
> +}
> +EXPORT_SYMBOL(rtc_show_time);
> -- 
> 2.14.0.rc0.284.gd933b75aa4-goog
> 

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

Reply via email to