diff options
| author | Feng Tang <feng.tang@intel.com> | 2011-03-22 19:34:21 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-22 20:44:12 -0400 |
| commit | fe3d8ad31cf51b062bbb8a9609eeb1d0c41a7f30 (patch) | |
| tree | f0e0f85582a695d0da7bae97897835ee51a0ab09 | |
| parent | 7bf693951a8e5f7e600a45b74d91d962a453146e (diff) | |
console: prevent registered consoles from dumping old kernel message over again
For a platform with many consoles like:
"console=tty1 console=ttyMFD2 console=ttyS0 earlyprintk=mrst"
Each time when the non "selected_console" (tty1 and ttyMFD2 here) get
registered, the existing kernel message will be printed out on registered
consoles again, the "mrst" early console will get some same message for 3
times, and "tty1" will get some for twice.
As suggested by Andrew Morton, every time a new console is registered, it
will be set as the "exclusive" console which will dump the already
existing kernel messages.
Signed-off-by: Feng Tang <feng.tang@intel.com>
Cc: Greg KH <gregkh@suse.de>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | kernel/printk.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 2b591f252e5..a53607eea6d 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -113,6 +113,11 @@ static unsigned con_start; /* Index into log_buf: next char to be sent to consol | |||
| 113 | static unsigned log_end; /* Index into log_buf: most-recently-written-char + 1 */ | 113 | static unsigned log_end; /* Index into log_buf: most-recently-written-char + 1 */ |
| 114 | 114 | ||
| 115 | /* | 115 | /* |
| 116 | * If exclusive_console is non-NULL then only this console is to be printed to. | ||
| 117 | */ | ||
| 118 | static struct console *exclusive_console; | ||
| 119 | |||
| 120 | /* | ||
| 116 | * Array of consoles built from command line options (console=) | 121 | * Array of consoles built from command line options (console=) |
| 117 | */ | 122 | */ |
| 118 | struct console_cmdline | 123 | struct console_cmdline |
| @@ -476,6 +481,8 @@ static void __call_console_drivers(unsigned start, unsigned end) | |||
| 476 | struct console *con; | 481 | struct console *con; |
| 477 | 482 | ||
| 478 | for_each_console(con) { | 483 | for_each_console(con) { |
| 484 | if (exclusive_console && con != exclusive_console) | ||
| 485 | continue; | ||
| 479 | if ((con->flags & CON_ENABLED) && con->write && | 486 | if ((con->flags & CON_ENABLED) && con->write && |
| 480 | (cpu_online(smp_processor_id()) || | 487 | (cpu_online(smp_processor_id()) || |
| 481 | (con->flags & CON_ANYTIME))) | 488 | (con->flags & CON_ANYTIME))) |
| @@ -1230,6 +1237,11 @@ void console_unlock(void) | |||
| 1230 | local_irq_restore(flags); | 1237 | local_irq_restore(flags); |
| 1231 | } | 1238 | } |
| 1232 | console_locked = 0; | 1239 | console_locked = 0; |
| 1240 | |||
| 1241 | /* Release the exclusive_console once it is used */ | ||
| 1242 | if (unlikely(exclusive_console)) | ||
| 1243 | exclusive_console = NULL; | ||
| 1244 | |||
| 1233 | up(&console_sem); | 1245 | up(&console_sem); |
| 1234 | spin_unlock_irqrestore(&logbuf_lock, flags); | 1246 | spin_unlock_irqrestore(&logbuf_lock, flags); |
| 1235 | if (wake_klogd) | 1247 | if (wake_klogd) |
| @@ -1464,6 +1476,12 @@ void register_console(struct console *newcon) | |||
| 1464 | spin_lock_irqsave(&logbuf_lock, flags); | 1476 | spin_lock_irqsave(&logbuf_lock, flags); |
| 1465 | con_start = log_start; | 1477 | con_start = log_start; |
| 1466 | spin_unlock_irqrestore(&logbuf_lock, flags); | 1478 | spin_unlock_irqrestore(&logbuf_lock, flags); |
| 1479 | /* | ||
| 1480 | * We're about to replay the log buffer. Only do this to the | ||
| 1481 | * just-registered console to avoid excessive message spam to | ||
| 1482 | * the already-registered consoles. | ||
| 1483 | */ | ||
| 1484 | exclusive_console = newcon; | ||
| 1467 | } | 1485 | } |
| 1468 | console_unlock(); | 1486 | console_unlock(); |
| 1469 | console_sysfs_notify(); | 1487 | console_sysfs_notify(); |
