diff options
author | Kay Sievers <kay@vrfy.org> | 2012-07-13 13:55:44 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2012-07-13 13:55:44 +0200 |
commit | 3fe1f8deed02ade01b4ea84177c28a9f6442126b (patch) | |
tree | 01d87f0b24ef629adf86d9124fdaadfb4c398913 | |
parent | b7d3669b17c5e569b78fcaeb660accf85316bd0d (diff) | |
download | patches-3fe1f8deed02ade01b4ea84177c28a9f6442126b.tar.gz |
add kmsg-console-cont-flush-merge.patch
-rw-r--r-- | kmsg-console-cont-flush-merge.patch | 129 | ||||
-rw-r--r-- | kmsg-cont-order.patch | 12 |
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; + } |