linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Martin Peschke <mp3@de.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: akpm@osdl.org
Subject: [patch 4/6] statistics infrastructure - prerequisite: timestamp
Date: Wed, 14 Dec 2005 17:14:09 +0100	[thread overview]
Message-ID: <43A044D1.1030704@de.ibm.com> (raw)

[patch 4/6] statistics infrastructure - prerequisite: timestamp

This patch separates the timestamp code out from printk. Thus, other
components, like the statistics infrastructure, can also make use of it
and provide similar timestamps. It just makes sense to have one timestamp
format throughout the kernel.

The original piece of code was a bit promiscuous, IMHO.
Please accept the little cleanup that comes with my patch.

And I think that I have fixed a printed_len related miscalculation.
printed_len needs to be increased if no valid log level has been found
and a log level prefix has been added by printk(). Otherwise, printed_len
must not be increased. The old code did it the other way around (in the
timestamp case).

Signed-off-by: Martin Peschke <mp3@de.ibm.com>
---

  include/linux/jiffies.h |    7 ++++
  kernel/printk.c         |   74 +++++++++++++++++++-----------------------------
  2 files changed, 37 insertions(+), 44 deletions(-)

diff -Nurp d/include/linux/jiffies.h e/include/linux/jiffies.h
--- d/include/linux/jiffies.h	2005-10-28 02:02:08.000000000 +0200
+++ e/include/linux/jiffies.h	2005-12-14 14:07:00.000000000 +0100
@@ -447,4 +447,11 @@ static inline u64 nsec_to_clock_t(u64 x)
  	return x;
  }

+static inline int nsec_to_timestamp(char *s, unsigned long long t)
+{
+	unsigned long nsec_rem = do_div(t, 1000000000);
+	return sprintf(s, "[%5lu.%06lu]", (unsigned long)t, nsec_rem/1000);
+}
+#define TIMESTAMP_SIZE	30
+
  #endif
diff -Nurp d/kernel/printk.c e/kernel/printk.c
--- d/kernel/printk.c	2005-12-14 12:51:41.000000000 +0100
+++ e/kernel/printk.c	2005-12-14 14:07:00.000000000 +0100
@@ -532,7 +532,7 @@ asmlinkage int vprintk(const char *fmt,
  	int printed_len;
  	char *p;
  	static char printk_buf[1024];
-	static int log_level_unknown = 1;
+	static int new_line = 1;

  	preempt_disable();
  	if (unlikely(oops_in_progress) && printk_cpu == smp_processor_id())
@@ -549,59 +549,45 @@ asmlinkage int vprintk(const char *fmt,

  	/*
  	 * Copy the output into log_buf.  If the caller didn't provide
-	 * appropriate log level tags, we insert them here
+	 * appropriate log level tags, we insert them here.
  	 */
  	for (p = printk_buf; *p; p++) {
-		if (log_level_unknown) {
-                        /* log_level_unknown signals the start of a new line */
+		if (new_line) {
+			/* The log level token is first. */
+			int loglev_char;
+			if (p[0] == '<' && p[1] >='0' &&
+			    p[1] <= '7' && p[2] == '>') {
+				loglev_char = p[1];
+				p += 3;
+			} else	{
+				loglev_char = default_message_loglevel + '0';
+				printed_len += 3;
+			}
+			emit_log_char('<');
+			emit_log_char(loglev_char);
+			emit_log_char('>');
+			/* A timestamp, if requested, goes next. */
  			if (printk_time) {
-				int loglev_char;
-				char tbuf[50], *tp;
-				unsigned tlen;
-				unsigned long long t;
-				unsigned long nanosec_rem;
-
-				/*
-				 * force the log level token to be
-				 * before the time output.
-				 */
-				if (p[0] == '<' && p[1] >='0' &&
-				   p[1] <= '7' && p[2] == '>') {
-					loglev_char = p[1];
-					p += 3;
-					printed_len += 3;
-				} else {
-					loglev_char = default_message_loglevel
-						+ '0';
-				}
-				t = printk_clock();
-				nanosec_rem = do_div(t, 1000000000);
-				tlen = sprintf(tbuf,
-						"<%c>[%5lu.%06lu] ",
-						loglev_char,
-						(unsigned long)t,
-						nanosec_rem/1000);
-
-				for (tp = tbuf; tp < tbuf + tlen; tp++)
+				char tbuf[TIMESTAMP_SIZE], *tp;
+				printed_len += nsec_to_timestamp(tbuf,
+							printk_clock());
+				for (tp = tbuf; *tp; tp++)
  					emit_log_char(*tp);
-				printed_len += tlen - 3;
-			} else {
-				if (p[0] != '<' || p[1] < '0' ||
-				   p[1] > '7' || p[2] != '>') {
-					emit_log_char('<');
-					emit_log_char(default_message_loglevel
-						+ '0');
-					emit_log_char('>');
-				}
-				printed_len += 3;
+				emit_log_char(' ');
+				printed_len++;
  			}
-			log_level_unknown = 0;
+			new_line = 0;
  			if (!*p)
  				break;
  		}
+		/*
+		 * Once we are done with special strings at the head of
+		 * each line, we just keep copying characters until
+		 * we come across another line and need to start over.
+		 */
  		emit_log_char(*p);
  		if (*p == '\n')
-			log_level_unknown = 1;
+			new_line = 1;
  	}

  	if (!cpu_online(smp_processor_id())) {

                 reply	other threads:[~2005-12-14 16:14 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=43A044D1.1030704@de.ibm.com \
    --to=mp3@de.ibm.com \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).