summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2012-07-13 14:45:10 +0200
committerKay Sievers <kay@vrfy.org>2012-07-13 14:45:10 +0200
commit14c26e940c99c79209219fe0b08535f493020b93 (patch)
treebf66828215aa837f58d0be75e0d68b262b4764af
parent3fe1f8deed02ade01b4ea84177c28a9f6442126b (diff)
downloadpatches-14c26e940c99c79209219fe0b08535f493020b93.tar.gz
update
-rw-r--r--kmsg-console-cont-flush-merge.patch76
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;