diff options
author | Kay Sievers <kay@vrfy.org> | 2012-07-13 14:45:10 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2012-07-13 14:45:10 +0200 |
commit | 14c26e940c99c79209219fe0b08535f493020b93 (patch) | |
tree | bf66828215aa837f58d0be75e0d68b262b4764af | |
parent | 3fe1f8deed02ade01b4ea84177c28a9f6442126b (diff) | |
download | patches-14c26e940c99c79209219fe0b08535f493020b93.tar.gz |
update
-rw-r--r-- | kmsg-console-cont-flush-merge.patch | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/kmsg-console-cont-flush-merge.patch b/kmsg-console-cont-flush-merge.patch index 28c09d4..2fd0f5d 100644 --- a/kmsg-console-cont-flush-merge.patch +++ b/kmsg-console-cont-flush-merge.patch @@ -1,6 +1,6 @@ --- - kernel/printk.c | 31 +++++++++++++++++++------------ - 1 file changed, 19 insertions(+), 12 deletions(-) + kernel/printk.c | 65 +++++++++++++++++++++++++++++++++++++------------------- + 1 file changed, 44 insertions(+), 21 deletions(-) --- a/kernel/printk.c +++ b/kernel/printk.c @@ -16,18 +16,6 @@ /* 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 */ @@ -97,7 +85,7 @@ static struct cont { size_t len; size_t cons; -@@ -1962,11 +1972,6 @@ void wake_up_klogd(void) +@@ -1962,10 +1972,34 @@ void wake_up_klogd(void) this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP); } @@ -105,21 +93,59 @@ -static u64 console_seq; -static u32 console_idx; -static enum log_flags console_prev; -- ++static void console_cont_flush(char *text, size_t size) ++{ ++ unsigned long flags; ++ size_t len; ++ ++ raw_spin_lock_irqsave(&logbuf_lock, flags); ++ ++ if (!cont.len) ++ goto out; ++ ++ /* ++ * We still queue earlier records, likely because the cnsole was ++ * busy. The earlier ones need to be printed before this one, we ++ * did not flush any fragment so far, so just let it queue up. ++ */ ++ if (console_seq < log_next_seq && !cont.cons) ++ goto out; ++ ++ len = cont_print_text(text, size); ++ raw_spin_unlock(&logbuf_lock); ++ stop_critical_timings(); ++ call_console_drivers(cont.level, text, len); ++ start_critical_timings(); ++ local_irq_restore(flags); ++ return; ++out: ++ raw_spin_unlock_irqrestore(&logbuf_lock, flags); ++} + /** * console_unlock - unlock the console system - * -@@ -1998,7 +2003,8 @@ void console_unlock(void) +@@ -1997,19 +2031,7 @@ void console_unlock(void) + console_may_schedule = 0; /* flush buffered message fragment immediately to console */ - raw_spin_lock_irqsave(&logbuf_lock, flags); +- 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: +- size_t len; +- +- len = cont_print_text(text, sizeof(text)); +- raw_spin_unlock(&logbuf_lock); +- stop_critical_timings(); +- call_console_drivers(cont.level, text, len); +- start_critical_timings(); +- local_irq_restore(flags); +- } else +- raw_spin_unlock_irqrestore(&logbuf_lock, flags); +- ++ console_cont_flush(text, sizeof(text)); + again: + for (;;) { + struct log *msg; +@@ -2046,6 +2068,7 @@ skip: * will properly dump everything later. */ msg->flags &= ~LOG_NOCONS; |