diff options
author | Kay Sievers <kay@vrfy.org> | 2012-05-14 17:50:25 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2012-05-14 17:50:25 +0200 |
commit | 957e9ef2ae63748a93fa6513c40849263e5ecf21 (patch) | |
tree | e13c2aae00ff2417abcce794da7f8c64e5ca9247 | |
parent | a5a8a9cadc5ef36a62de517060fc866e2b77a16e (diff) | |
download | patches-957e9ef2ae63748a93fa6513c40849263e5ecf21.tar.gz |
rebase on driver-core tree
-rw-r--r-- | kmsg-multiline.patch | 243 | ||||
-rw-r--r-- | kmsg-sep-cont.patch | 3 | ||||
-rw-r--r-- | series | 4 |
3 files changed, 4 insertions, 246 deletions
diff --git a/kmsg-multiline.patch b/kmsg-multiline.patch deleted file mode 100644 index 46c751c..0000000 --- a/kmsg-multiline.patch +++ /dev/null @@ -1,243 +0,0 @@ -From: Kay Sievers <kay@vrfy.org> -Subject: printk() - restore prefix/timestamp printing for multi-newline strings - -Calls like: - printk("\n *** DEADLOCK ***\n\n"); -will print 3 properly indented, seperated, syslog + timestamp prefixed lines in -the log output. - -Reported-By: Sasha Levin <levinsasha928@gmail.com> -Signed-off-by: Kay Sievers <kay@vrfy.org> ---- - - kernel/printk.c | 133 +++++++++++++++++++++++++++++++++----------------------- - 1 file changed, 79 insertions(+), 54 deletions(-) - ---- a/kernel/printk.c -+++ b/kernel/printk.c -@@ -448,7 +448,7 @@ static ssize_t devkmsg_read(struct file - - /* escape non-printable characters */ - for (i = 0; i < msg->text_len; i++) { -- char c = log_text(msg)[i]; -+ unsigned char c = log_text(msg)[i]; - - if (c < ' ' || c >= 128) - len += sprintf(user->buf + len, "\\x%02x", c); -@@ -461,7 +461,7 @@ static ssize_t devkmsg_read(struct file - bool line = true; - - for (i = 0; i < msg->dict_len; i++) { -- char c = log_dict(msg)[i]; -+ unsigned char c = log_dict(msg)[i]; - - if (line) { - user->buf[len++] = ' '; -@@ -785,56 +785,81 @@ static bool printk_time; - #endif - module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); - --static size_t prepend_timestamp(unsigned long long t, char *buf) -+static size_t print_prefix(const struct log *msg, bool syslog, char *buf) - { -- unsigned long rem_ns; -+ size_t len = 0; - -- if (!printk_time) -- return 0; -+ if (syslog) { -+ if (buf) { -+ len += sprintf(buf, "<%u>", msg->level); -+ } else { -+ len += 3; -+ if (msg->level > 9) -+ len++; -+ if (msg->level > 99) -+ len++; -+ } -+ } - -- if (!buf) -- return 15; -+ if (printk_time) { -+ if (buf) { -+ unsigned long long ts = msg->ts_nsec; -+ unsigned long rem_nsec = do_div(ts, 1000000000); - -- rem_ns = do_div(t, 1000000000); -+ len += sprintf(buf + len, "[%5lu.%06lu] ", -+ (unsigned long) ts, rem_nsec / 1000); -+ } else { -+ len += 15; -+ } -+ } - -- return sprintf(buf, "[%5lu.%06lu] ", -- (unsigned long) t, rem_ns / 1000); -+ return len; - } - --static int syslog_print_line(u32 idx, char *text, size_t size) -+static size_t msg_print_text(const struct log *msg, bool syslog, -+ char *buf, size_t size) - { -- struct log *msg; -- size_t len; -+ const char *text = log_text(msg); -+ size_t text_size = msg->text_len; -+ size_t len = 0; -+ -+ do { -+ const char *next = memchr(text, '\n', text_size); -+ size_t text_len; -+ -+ if (next) { -+ text_len = next - text; -+ next++; -+ text_size -= next - text; -+ } else { -+ text_len = text_size; -+ } -+ -+ if (buf) { -+ if (print_prefix(msg, syslog, NULL) + -+ text_len + 1>= size - len) -+ break; -+ -+ len += print_prefix(msg, syslog, buf + len); -+ memcpy(buf + len, text, text_len); -+ len += text_len; -+ buf[len++] = '\n'; -+ } else { -+ /* SYSLOG_ACTION_* buffer size only calculation */ -+ len += print_prefix(msg, syslog, NULL); -+ len += text_len + 1; -+ } -+ -+ text = next; -+ } while (text); - -- msg = log_from_idx(idx); -- if (!text) { -- /* calculate length only */ -- len = 3; -- -- if (msg->level > 9) -- len++; -- if (msg->level > 99) -- len++; -- len += prepend_timestamp(0, NULL); -- -- len += msg->text_len; -- len++; -- return len; -- } -- -- len = sprintf(text, "<%u>", msg->level); -- len += prepend_timestamp(msg->ts_nsec, text + len); -- if (len + msg->text_len > size) -- return -EINVAL; -- memcpy(text + len, log_text(msg), msg->text_len); -- len += msg->text_len; -- text[len++] = '\n'; - return len; - } - - static int syslog_print(char __user *buf, int size) - { - char *text; -+ struct log *msg; - int len; - - text = kmalloc(LOG_LINE_MAX, GFP_KERNEL); -@@ -847,7 +872,8 @@ static int syslog_print(char __user *buf - syslog_seq = log_first_seq; - syslog_idx = log_first_idx; - } -- len = syslog_print_line(syslog_idx, text, LOG_LINE_MAX); -+ msg = log_from_idx(syslog_idx); -+ len = msg_print_text(msg, true, text, LOG_LINE_MAX); - syslog_idx = log_next(syslog_idx); - syslog_seq++; - raw_spin_unlock_irq(&logbuf_lock); -@@ -887,14 +913,18 @@ static int syslog_print_all(char __user - seq = clear_seq; - idx = clear_idx; - while (seq < log_next_seq) { -- len += syslog_print_line(idx, NULL, 0); -+ struct log *msg = log_from_idx(idx); -+ -+ len += msg_print_text(msg, true, NULL, 0); - idx = log_next(idx); - seq++; - } - seq = clear_seq; - idx = clear_idx; - while (len > size && seq < log_next_seq) { -- len -= syslog_print_line(idx, NULL, 0); -+ struct log *msg = log_from_idx(idx); -+ -+ len -= msg_print_text(msg, true, NULL, 0); - idx = log_next(idx); - seq++; - } -@@ -904,9 +934,10 @@ static int syslog_print_all(char __user - - len = 0; - while (len >= 0 && seq < next_seq) { -+ struct log *msg = log_from_idx(idx); - int textlen; - -- textlen = syslog_print_line(idx, text, LOG_LINE_MAX); -+ textlen = msg_print_text(msg, true, text, LOG_LINE_MAX); - if (textlen < 0) { - len = textlen; - break; -@@ -1044,7 +1075,9 @@ int do_syslog(int type, char __user *buf - seq = syslog_seq; - idx = syslog_idx; - while (seq < log_next_seq) { -- error += syslog_print_line(idx, NULL, 0); -+ struct log *msg = log_from_idx(idx); -+ -+ error += msg_print_text(msg, true, NULL, 0); - idx = log_next(idx); - seq++; - } -@@ -1439,10 +1472,8 @@ static struct log *log_from_idx(u32 idx) - static u32 log_next(u32 idx) { return 0; } - static char *log_text(const struct log *msg) { return NULL; } - static void call_console_drivers(int level, const char *text, size_t len) {} --static size_t prepend_timestamp(unsigned long long t, char *buf) --{ -- return 0; --} -+static size_t msg_print_text(const struct log *msg, bool syslog, -+ char *buf, size_t size) { return 0; } - - #endif /* CONFIG_PRINTK */ - -@@ -1750,7 +1781,7 @@ again: - for (;;) { - struct log *msg; - static char text[LOG_LINE_MAX]; -- size_t len, l; -+ size_t len; - int level; - - raw_spin_lock_irqsave(&logbuf_lock, flags); -@@ -1771,13 +1802,7 @@ again: - msg = log_from_idx(console_idx); - level = msg->level & 7; - -- len = prepend_timestamp(msg->ts_nsec, text); -- l = msg->text_len; -- if (len + l + 1 >= sizeof(text)) -- l = sizeof(text) - len - 1; -- memcpy(text + len, log_text(msg), l); -- len += l; -- text[len++] = '\n'; -+ len = msg_print_text(msg, false, text, sizeof(text)); - - console_idx = log_next(console_idx); - console_seq++; diff --git a/kmsg-sep-cont.patch b/kmsg-sep-cont.patch index c7457ea..d2ef33a 100644 --- a/kmsg-sep-cont.patch +++ b/kmsg-sep-cont.patch @@ -17,7 +17,8 @@ race against each other, one of them printing a single full terminated line: printk("(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)\n"); -The other one printing a line in a continuation loop: +The other one printing the line, every character separate in a +continuation loop: printk("(C"); for (i = 0; i < 58; i++) printk(KERN_CONT "C"); @@ -1,3 +1,3 @@ -printk-race.patch -kmsg-multiline.patch kmsg-sep-cont.patch +printk-race.patch + |