mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [RFC] printk: add relative printk timing support
@ 2012-05-17 15:02 Sasha Levin
  2012-05-17 15:23 ` Kay Sievers
  2012-05-17 15:37 ` Kay Sievers
  0 siblings, 2 replies; 3+ messages in thread
From: Sasha Levin @ 2012-05-17 15:02 UTC (permalink / raw)
  To: greg, kay, torvalds; +Cc: mingo, linux-kernel, joe, hpa, yinghai, Sasha Levin

This patch adds support for relative timestamps in printk output.

First, this is how it looks now:

[  120.001386] foo
[  181.036862] bar
[  186.070696] zoot
[  196.288022] foo
[  257.415895] bar
[  257.416580] zoot

Next, with Linus' suggestion (Month and date, no seconds):

[May 17 14:13] foo
[May 17 14:14] bar
[+05.00026906] zoot
[+10.00054898] foo
[May 17 14:15] bar
[+00.00000668] zoot

And Peter's suggestion (MS accurate absolute time):

[14:16:57.970] foo
[14:17:59.063] bar
[+05.00032139] zoot
[+10.00336079] foo
[14:19:15.677] bar
[+00.00001905] zoot

Todo:
 - Can we get rid of the spinlock somehow? I tried using atomic64_t, but got
hit with races causing odd prints.
 - Do we want to make the 60 second "timeout" for printing abs time
configurable?
- Are there any other formats we would want to add?

Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
---
 kernel/printk.c |   50 ++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/kernel/printk.c b/kernel/printk.c
index 32462d2..9d008e5 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -779,11 +779,12 @@ static int check_syslog_permissions(int type, bool from_file)
 }
 
 #if defined(CONFIG_PRINTK_TIME)
-static bool printk_time = 1;
+static int printk_time = 1;
 #else
-static bool printk_time;
+static int printk_time;
 #endif
-module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
+module_param_named(time, printk_time, int, S_IRUGO | S_IWUSR);
+static DEFINE_SPINLOCK(printk_time_rel);
 
 static size_t print_prefix(const struct log *msg, bool syslog, char *buf)
 {
@@ -801,16 +802,53 @@ static size_t print_prefix(const struct log *msg, bool syslog, char *buf)
 		}
 	}
 
-	if (printk_time) {
+	if (printk_time == 1) {
 		if (buf) {
 			unsigned long long ts = msg->ts_nsec;
-			unsigned long rem_nsec = do_div(ts, 1000000000);
+			unsigned long rem_nsec = do_div(ts, NSEC_PER_SEC);
 
 			len += sprintf(buf + len, "[%5lu.%06lu] ",
-					 (unsigned long) ts, rem_nsec / 1000);
+					 (unsigned long) ts, rem_nsec / NSEC_PER_USEC);
 		} else {
 			len += 15;
 		}
+	} else if (printk_time == 2 || printk_time == 3) {
+		static unsigned long long last_print;
+		unsigned long long ts = msg->ts_nsec;
+		unsigned long rem_nsec;
+		bool rel = 0;
+		static const char *months[12] = {"Jan", "Feb", "Mar", "Apr",
+						"May", "Jun", "Jul", "Aug",
+						"Sep", "Oct", "Nov", "Dec",};
+
+		if (!buf)
+			return len + 15;
+
+		spin_lock(&printk_time_rel);
+		if ((ts - last_print) / NSEC_PER_SEC < 60) {
+			rel = 1;
+			ts -= last_print;
+		}
+		last_print = msg->ts_nsec;
+		spin_unlock(&printk_time_rel);
+
+		rem_nsec = do_div(ts, NSEC_PER_SEC);
+		if (rel) {
+			len += sprintf(buf + len, "[%+03d.%08lu] ",
+					(int)ts, rem_nsec / NSEC_PER_USEC);
+		} else {
+			struct tm tm;
+
+			time_to_tm(get_seconds(), 0, &tm);
+			if (printk_time == 2)
+				len += sprintf(buf + len, "[%s %02d %02d:%02d] ",
+						months[tm.tm_mon], tm.tm_mday,
+						tm.tm_hour, tm.tm_min);
+			if (printk_time == 3)
+				len += sprintf(buf + len, "[%02d:%02d:%02d.%03lu] ",
+						tm.tm_hour, tm.tm_min, tm.tm_sec,
+						rem_nsec / NSEC_PER_MSEC);
+		}
 	}
 
 	return len;
-- 
1.7.8.6


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RFC] printk: add relative printk timing support
  2012-05-17 15:02 [RFC] printk: add relative printk timing support Sasha Levin
@ 2012-05-17 15:23 ` Kay Sievers
  2012-05-17 15:37 ` Kay Sievers
  1 sibling, 0 replies; 3+ messages in thread
From: Kay Sievers @ 2012-05-17 15:23 UTC (permalink / raw)
  To: Sasha Levin; +Cc: greg, torvalds, mingo, linux-kernel, joe, hpa, yinghai

On Thu, May 17, 2012 at 5:02 PM, Sasha Levin <levinsasha928@gmail.com> wrote:
> This patch adds support for relative timestamps in printk output.


> Next, with Linus' suggestion (Month and date, no seconds):
>
> [May 17 14:13] foo

Any idea how to handle suspend cycles right? The wall clock time
translation might not be correct anymore, or is that covered?

Also, we currently record local CPU times, they are only guaranteed to
be monotonic for the same CPU, not across them. So we could see
negative offsets?

Kay

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RFC] printk: add relative printk timing support
  2012-05-17 15:02 [RFC] printk: add relative printk timing support Sasha Levin
  2012-05-17 15:23 ` Kay Sievers
@ 2012-05-17 15:37 ` Kay Sievers
  1 sibling, 0 replies; 3+ messages in thread
From: Kay Sievers @ 2012-05-17 15:37 UTC (permalink / raw)
  To: Sasha Levin; +Cc: greg, torvalds, mingo, linux-kernel, joe, hpa, yinghai

On Thu, May 17, 2012 at 5:02 PM, Sasha Levin <levinsasha928@gmail.com> wrote:
> This patch adds support for relative timestamps in printk output.

>  static size_t print_prefix(const struct log *msg, bool syslog, char *buf)

> +       } else if (printk_time == 2 || printk_time == 3) {
> +               static unsigned long long last_print;

We can have multiple concurrent users of the relative time calculation, right?

I guess the last_print needs to be localized to every possible user
and concurrent instance: syslog(dmesg),  syslog(/proc/kmsg), console
output, to not race against each other?

Kay

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-05-17 15:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-17 15:02 [RFC] printk: add relative printk timing support Sasha Levin
2012-05-17 15:23 ` Kay Sievers
2012-05-17 15:37 ` Kay Sievers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®