summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2012-07-13 13:55:44 +0200
committerKay Sievers <kay@vrfy.org>2012-07-13 13:55:44 +0200
commit3fe1f8deed02ade01b4ea84177c28a9f6442126b (patch)
tree01d87f0b24ef629adf86d9124fdaadfb4c398913
parentb7d3669b17c5e569b78fcaeb660accf85316bd0d (diff)
downloadpatches-3fe1f8deed02ade01b4ea84177c28a9f6442126b.tar.gz
add kmsg-console-cont-flush-merge.patch
-rw-r--r--kmsg-console-cont-flush-merge.patch129
-rw-r--r--kmsg-cont-order.patch12
2 files changed, 135 insertions, 6 deletions
diff --git a/kmsg-console-cont-flush-merge.patch b/kmsg-console-cont-flush-merge.patch
new file mode 100644
index 0000000..28c09d4
--- /dev/null
+++ b/kmsg-console-cont-flush-merge.patch
@@ -0,0 +1,129 @@
+---
+ kernel/printk.c | 31 +++++++++++++++++++------------
+ 1 file changed, 19 insertions(+), 12 deletions(-)
+
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -231,6 +231,11 @@ static u32 log_first_idx;
+ static u64 log_next_seq;
+ static u32 log_next_idx;
+
++/* the next printk record to write to the console */
++static u64 console_seq;
++static u32 console_idx;
++static enum log_flags console_prev;
++
+ /* the next printk record to read after the last 'clear' command */
+ static u64 clear_seq;
+ static u32 clear_idx;
+@@ -480,9 +485,9 @@ static ssize_t devkmsg_read(struct file
+ ((user->prev & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
+ cont = '+';
+
+- len = sprintf(user->buf, "%u,%llu,%llu,%c;",
++ len = sprintf(user->buf, "%u,%llu,%llu,%c,XXX%u;",
+ (msg->facility << 3) | msg->level,
+- user->seq, ts_usec, cont);
++ user->seq, ts_usec, cont, msg->flags);
+ user->prev = msg->flags;
+
+ /* escape non-printable characters */
+@@ -1386,6 +1391,7 @@ static struct cont {
+ u64 ts_nsec; /* time of first print */
+ u8 level; /* log level of first message */
+ u8 facility; /* log level of first message */
++ enum log_flags flags; /* prefix, newline flags */
+ bool flushed:1; /* buffer sealed and committed */
+ } cont;
+
+@@ -1404,6 +1410,7 @@ static void cont_flush(enum log_flags fl
+ */
+ log_store(cont.facility, cont.level, flags | LOG_NOCONS,
+ cont.ts_nsec, NULL, 0, cont.buf, cont.len);
++ cont.flags = flags;
+ cont.flushed = true;
+ } else {
+ /*
+@@ -1432,6 +1439,7 @@ static bool cont_add(int facility, int l
+ cont.level = level;
+ cont.owner = current;
+ cont.ts_nsec = local_clock();
++ cont.flags = 0;
+ cont.cons = 0;
+ cont.flushed = false;
+ }
+@@ -1446,7 +1454,7 @@ static size_t cont_print_text(char *text
+ size_t textlen = 0;
+ size_t len;
+
+- if (cont.cons == 0) {
++ if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) {
+ textlen += print_time(cont.ts_nsec, text);
+ size -= textlen;
+ }
+@@ -1461,7 +1469,8 @@ static size_t cont_print_text(char *text
+ }
+
+ if (cont.flushed) {
+- text[textlen++] = '\n';
++ if (cont.flags & LOG_NEWLINE)
++ text[textlen++] = '\n';
+ /* got everything, release buffer */
+ cont.len = 0;
+ }
+@@ -1559,7 +1568,7 @@ asmlinkage int vprintk_emit(int facility
+ * or another task also prints continuation lines.
+ */
+ if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
+- cont_flush(0);
++ cont_flush(LOG_NEWLINE);
+
+ /* buffer line if possible, otherwise store it right away */
+ if (!cont_add(facility, level, text, text_len))
+@@ -1577,7 +1586,7 @@ asmlinkage int vprintk_emit(int facility
+ if (cont.len && cont.owner == current) {
+ if (!(lflags & LOG_PREFIX))
+ stored = cont_add(facility, level, text, text_len);
+- cont_flush(0);
++ cont_flush(LOG_NEWLINE);
+ }
+
+ if (!stored)
+@@ -1679,6 +1688,7 @@ static enum log_flags syslog_prev;
+ static u64 log_first_seq;
+ static u32 log_first_idx;
+ static u64 log_next_seq;
++static enum log_flags console_prev;
+ static struct cont {
+ size_t len;
+ size_t cons;
+@@ -1962,11 +1972,6 @@ void wake_up_klogd(void)
+ this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
+ }
+
+-/* the next printk record to write to the console */
+-static u64 console_seq;
+-static u32 console_idx;
+-static enum log_flags console_prev;
+-
+ /**
+ * console_unlock - unlock the console system
+ *
+@@ -1998,7 +2003,8 @@ void console_unlock(void)
+
+ /* flush buffered message fragment immediately to console */
+ raw_spin_lock_irqsave(&logbuf_lock, flags);
+- if (cont.len && (cont.cons < cont.len || cont.flushed)) {
++ if ((console_seq == log_next_seq && cont.len && (cont.cons < cont.len || cont.flushed)) ||
++ (cont.len && cont.cons)) {
+ size_t len;
+
+ len = cont_print_text(text, sizeof(text));
+@@ -2046,6 +2052,7 @@ skip:
+ * will properly dump everything later.
+ */
+ msg->flags &= ~LOG_NOCONS;
++ console_prev = msg->flags;
+ goto skip;
+ }
+
diff --git a/kmsg-cont-order.patch b/kmsg-cont-order.patch
index 3221e16..95d5a2d 100644
--- a/kmsg-cont-order.patch
+++ b/kmsg-cont-order.patch
@@ -14,19 +14,19 @@
- cont.flushed = true;
+ if (cont.cons) {
+ /*
-+ * If we have flushed a fragment of this line to the console,
-+ * we need to wait for the console to pick up the full line.
-+ * We add a flag to suppress a duplicated output from the store.
++ * If a fragment of this line was directly flushed to the
++ * console; wait for the console to pick up the rest of the
++ * line. LOG_NOCONS suppresses a duplicated output.
+ */
+ log_store(cont.facility, cont.level, flags | LOG_NOCONS,
+ cont.ts_nsec, NULL, 0, cont.buf, cont.len);
+ cont.flushed = true;
+ } else {
+ /*
-+ * If we never flushed a fragment of this line to the console,
-+ * we can just submit it to the store and free the buffer.
++ * If no fragment of this line ever reached the console,
++ * just submit it to the store and free the buffer.
+ */
-+ log_store(cont.facility, cont.level, flags, cont.ts_nsec,
++ log_store(cont.facility, cont.level, flags, 0,
+ NULL, 0, cont.buf, cont.len);
+ cont.len = 0;
+ }