Blame view
kernel/printk.c
43.5 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * linux/kernel/printk.c * * Copyright (C) 1991, 1992 Linus Torvalds * * Modified to make sys_syslog() more flexible: added commands to * return the last 4k of kernel messages, regardless of whether * they've been read or not. Added option to suppress kernel printk's * to the console. Added hook for sending the console messages * elsewhere, in preparation for a serial line console (someday). * Ted Ts'o, 2/11/93. * Modified for sysctl support, 1/8/97, Chris Horn. |
40dc56512 [PATCH] cleanup f... |
13 |
* Fixed SMP synchronization, 08/08/99, Manfred Spraul |
624dffcbc correct email add... |
14 |
* manfred@colorfullife.com |
1da177e4c Linux-2.6.12-rc2 |
15 |
* Rewrote bits to get rid of console_lock |
e1f8e8744 Remove Andrew Mor... |
16 |
* 01Mar01 Andrew Morton |
1da177e4c Linux-2.6.12-rc2 |
17 18 19 20 21 22 |
*/ #include <linux/kernel.h> #include <linux/mm.h> #include <linux/tty.h> #include <linux/tty_driver.h> |
1da177e4c Linux-2.6.12-rc2 |
23 24 |
#include <linux/console.h> #include <linux/init.h> |
bfe8df3d3 slow down printk ... |
25 26 |
#include <linux/jiffies.h> #include <linux/nmi.h> |
1da177e4c Linux-2.6.12-rc2 |
27 |
#include <linux/module.h> |
3b9c04106 [PATCH] printk ti... |
28 |
#include <linux/moduleparam.h> |
1da177e4c Linux-2.6.12-rc2 |
29 |
#include <linux/interrupt.h> /* For in_interrupt() */ |
1da177e4c Linux-2.6.12-rc2 |
30 31 32 33 |
#include <linux/delay.h> #include <linux/smp.h> #include <linux/security.h> #include <linux/bootmem.h> |
162a7e750 printk: allocate ... |
34 |
#include <linux/memblock.h> |
1da177e4c Linux-2.6.12-rc2 |
35 |
#include <linux/syscalls.h> |
04d491ab2 kexec: add dmesg ... |
36 |
#include <linux/kexec.h> |
d37d39ae3 printk,kdb: captu... |
37 |
#include <linux/kdb.h> |
3fff4c42b printk: Remove ra... |
38 |
#include <linux/ratelimit.h> |
456b565cc core: Add kernel ... |
39 |
#include <linux/kmsg_dump.h> |
002345925 syslog: distingui... |
40 |
#include <linux/syslog.h> |
034260d67 printk: fix delay... |
41 42 |
#include <linux/cpu.h> #include <linux/notifier.h> |
fb842b00c printk: use RCU t... |
43 |
#include <linux/rculist.h> |
1da177e4c Linux-2.6.12-rc2 |
44 45 |
#include <asm/uaccess.h> |
076f9776f x86: make early p... |
46 47 48 |
/* * Architectures can override it: */ |
e17ba73b0 x86, generic: mar... |
49 |
void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...) |
076f9776f x86: make early p... |
50 51 |
{ } |
1da177e4c Linux-2.6.12-rc2 |
52 53 54 |
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) /* printk's without a loglevel use this.. */ |
5af5bcb8d printk: allow set... |
55 |
#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL |
1da177e4c Linux-2.6.12-rc2 |
56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* We show everything that is MORE important than this.. */ #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */ #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */ DECLARE_WAIT_QUEUE_HEAD(log_wait); int console_printk[4] = { DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */ DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */ MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */ DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */ }; |
1da177e4c Linux-2.6.12-rc2 |
69 |
/* |
0bbfb7c2e kernel/printk.c: ... |
70 |
* Low level drivers may need that to know if they can schedule in |
1da177e4c Linux-2.6.12-rc2 |
71 72 73 74 75 76 77 78 79 80 |
* their unblank() callback or not. So let's export it. */ int oops_in_progress; EXPORT_SYMBOL(oops_in_progress); /* * console_sem protects the console_drivers list, and also * provides serialisation for access to the entire console * driver system. */ |
5b8c4f23c printk: Make cons... |
81 |
static DEFINE_SEMAPHORE(console_sem); |
1da177e4c Linux-2.6.12-rc2 |
82 |
struct console *console_drivers; |
a29d1cfe9 printk: export co... |
83 |
EXPORT_SYMBOL_GPL(console_drivers); |
1da177e4c Linux-2.6.12-rc2 |
84 85 86 87 88 89 90 91 |
/* * This is used for debugging the mess that is the VT code by * keeping track if we have the console semaphore held. It's * definitely not the perfect debug tool (we don't know if _WE_ * hold it are racing, but it helps tracking those weird code * path in the console code where we end up in places I want * locked without the console sempahore held */ |
557240b48 Add support for s... |
92 |
static int console_locked, console_suspended; |
1da177e4c Linux-2.6.12-rc2 |
93 94 95 96 |
/* * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars * It is also used in interesting ways to provide interlocking in |
ac751efa6 console: rename a... |
97 |
* console_unlock();. |
1da177e4c Linux-2.6.12-rc2 |
98 |
*/ |
07354eb1a locking, printk: ... |
99 |
static DEFINE_RAW_SPINLOCK(logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
100 |
|
eed4a2aba printk.c: use uns... |
101 |
#define LOG_BUF_MASK (log_buf_len-1) |
1da177e4c Linux-2.6.12-rc2 |
102 103 104 105 106 107 |
#define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK]) /* * The indices into log_buf are not constrained to log_buf_len - they * must be masked before subscripting */ |
eed4a2aba printk.c: use uns... |
108 109 110 |
static unsigned log_start; /* Index into log_buf: next char to be read by syslog() */ static unsigned con_start; /* Index into log_buf: next char to be sent to consoles */ static unsigned log_end; /* Index into log_buf: most-recently-written-char + 1 */ |
1da177e4c Linux-2.6.12-rc2 |
111 112 |
/* |
fe3d8ad31 console: prevent ... |
113 114 115 116 117 |
* If exclusive_console is non-NULL then only this console is to be printed to. */ static struct console *exclusive_console; /* |
1da177e4c Linux-2.6.12-rc2 |
118 119 120 121 122 123 124 |
* Array of consoles built from command line options (console=) */ struct console_cmdline { char name[8]; /* Name of the driver */ int index; /* Minor dev. to use */ char *options; /* Options for the driver */ |
f7511d5f6 Basic braille scr... |
125 126 127 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE char *brl_options; /* Options for braille driver */ #endif |
1da177e4c Linux-2.6.12-rc2 |
128 129 130 131 132 133 134 |
}; #define MAX_CMDLINECONSOLES 8 static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES]; static int selected_console = -1; static int preferred_console = -1; |
9e124fe16 xen: Enable conso... |
135 136 |
int console_set_on_cmdline; EXPORT_SYMBOL(console_set_on_cmdline); |
1da177e4c Linux-2.6.12-rc2 |
137 138 139 |
/* Flag: console code may call schedule() */ static int console_may_schedule; |
d59745ce3 [PATCH] clean up ... |
140 141 142 143 144 |
#ifdef CONFIG_PRINTK static char __log_buf[__LOG_BUF_LEN]; static char *log_buf = __log_buf; static int log_buf_len = __LOG_BUF_LEN; |
eed4a2aba printk.c: use uns... |
145 |
static unsigned logged_chars; /* Number of chars produced since last read+clear operation */ |
cea83886d printk: avoid war... |
146 |
static int saved_console_loglevel = -1; |
d59745ce3 [PATCH] clean up ... |
147 |
|
04d491ab2 kexec: add dmesg ... |
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
#ifdef CONFIG_KEXEC /* * This appends the listed symbols to /proc/vmcoreinfo * * /proc/vmcoreinfo is used by various utiilties, like crash and makedumpfile to * obtain access to symbols that are otherwise very difficult to locate. These * symbols are specifically used so that utilities can access and extract the * dmesg log from a vmcore file after a crash. */ void log_buf_kexec_setup(void) { VMCOREINFO_SYMBOL(log_buf); VMCOREINFO_SYMBOL(log_end); VMCOREINFO_SYMBOL(log_buf_len); VMCOREINFO_SYMBOL(logged_chars); } #endif |
162a7e750 printk: allocate ... |
165 166 167 168 |
/* requested log_buf_len from kernel cmdline */ static unsigned long __initdata new_log_buf_len; /* save requested log_buf_len since it's too early to process it */ |
1da177e4c Linux-2.6.12-rc2 |
169 170 |
static int __init log_buf_len_setup(char *str) { |
eed4a2aba printk.c: use uns... |
171 |
unsigned size = memparse(str, &str); |
1da177e4c Linux-2.6.12-rc2 |
172 173 174 |
if (size) size = roundup_pow_of_two(size); |
162a7e750 printk: allocate ... |
175 176 177 178 |
if (size > log_buf_len) new_log_buf_len = size; return 0; |
1da177e4c Linux-2.6.12-rc2 |
179 |
} |
162a7e750 printk: allocate ... |
180 181 182 183 184 185 186 187 188 189 190 |
early_param("log_buf_len", log_buf_len_setup); void __init setup_log_buf(int early) { unsigned long flags; unsigned start, dest_idx, offset; char *new_log_buf; int free; if (!new_log_buf_len) return; |
1da177e4c Linux-2.6.12-rc2 |
191 |
|
162a7e750 printk: allocate ... |
192 193 194 195 |
if (early) { unsigned long mem; mem = memblock_alloc(new_log_buf_len, PAGE_SIZE); |
1f5026a7e memblock: Kill ME... |
196 |
if (!mem) |
162a7e750 printk: allocate ... |
197 198 199 200 201 202 203 204 205 206 207 208 |
return; new_log_buf = __va(mem); } else { new_log_buf = alloc_bootmem_nopanic(new_log_buf_len); } if (unlikely(!new_log_buf)) { pr_err("log_buf_len: %ld bytes not available ", new_log_buf_len); return; } |
07354eb1a locking, printk: ... |
209 |
raw_spin_lock_irqsave(&logbuf_lock, flags); |
162a7e750 printk: allocate ... |
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
log_buf_len = new_log_buf_len; log_buf = new_log_buf; new_log_buf_len = 0; free = __LOG_BUF_LEN - log_end; offset = start = min(con_start, log_start); dest_idx = 0; while (start != log_end) { unsigned log_idx_mask = start & (__LOG_BUF_LEN - 1); log_buf[dest_idx] = __log_buf[log_idx_mask]; start++; dest_idx++; } log_start -= offset; con_start -= offset; log_end -= offset; |
07354eb1a locking, printk: ... |
227 |
raw_spin_unlock_irqrestore(&logbuf_lock, flags); |
162a7e750 printk: allocate ... |
228 229 230 231 232 233 234 |
pr_info("log_buf_len: %d ", log_buf_len); pr_info("early log buf free: %d(%d%%) ", free, (free * 100) / __LOG_BUF_LEN); } |
1da177e4c Linux-2.6.12-rc2 |
235 |
|
bfe8df3d3 slow down printk ... |
236 |
#ifdef CONFIG_BOOT_PRINTK_DELAY |
674dff650 printk: change ty... |
237 |
static int boot_delay; /* msecs delay after each printk during bootup */ |
3a3b6ed22 printk boot_delay... |
238 |
static unsigned long long loops_per_msec; /* based on boot_delay */ |
bfe8df3d3 slow down printk ... |
239 240 241 242 |
static int __init boot_delay_setup(char *str) { unsigned long lpj; |
bfe8df3d3 slow down printk ... |
243 244 245 246 247 248 249 |
lpj = preset_lpj ? preset_lpj : 1000000; /* some guess */ loops_per_msec = (unsigned long long)lpj / 1000 * HZ; get_option(&str, &boot_delay); if (boot_delay > 10 * 1000) boot_delay = 0; |
3a3b6ed22 printk boot_delay... |
250 251 252 253 |
pr_debug("boot_delay: %u, preset_lpj: %ld, lpj: %lu, " "HZ: %d, loops_per_msec: %llu ", boot_delay, preset_lpj, lpj, HZ, loops_per_msec); |
bfe8df3d3 slow down printk ... |
254 255 256 257 258 259 260 261 262 263 264 |
return 1; } __setup("boot_delay=", boot_delay_setup); static void boot_delay_msec(void) { unsigned long long k; unsigned long timeout; if (boot_delay == 0 || system_state != SYSTEM_BOOTING) return; |
3a3b6ed22 printk boot_delay... |
265 |
k = (unsigned long long)loops_per_msec * boot_delay; |
bfe8df3d3 slow down printk ... |
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 |
timeout = jiffies + msecs_to_jiffies(boot_delay); while (k) { k--; cpu_relax(); /* * use (volatile) jiffies to prevent * compiler reduction; loop termination via jiffies * is secondary and may or may not happen. */ if (time_after(jiffies, timeout)) break; touch_nmi_watchdog(); } } #else static inline void boot_delay_msec(void) { } #endif |
eaf06b241 Restrict unprivil... |
286 287 288 289 290 |
#ifdef CONFIG_SECURITY_DMESG_RESTRICT int dmesg_restrict = 1; #else int dmesg_restrict; #endif |
ee24aebff cap_syslog: accep... |
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
static int syslog_action_restricted(int type) { if (dmesg_restrict) return 1; /* Unless restricted, we allow "read all" and "get buffer size" for everybody */ return type != SYSLOG_ACTION_READ_ALL && type != SYSLOG_ACTION_SIZE_BUFFER; } static int check_syslog_permissions(int type, bool from_file) { /* * If this is from /proc/kmsg and we've already opened it, then we've * already done the capabilities checks at open time. */ if (from_file && type != SYSLOG_ACTION_OPEN) return 0; if (syslog_action_restricted(type)) { if (capable(CAP_SYSLOG)) return 0; /* For historical reasons, accept CAP_SYS_ADMIN too, with a warning */ if (capable(CAP_SYS_ADMIN)) { |
f2c0d0266 cap_syslog: don't... |
313 314 315 316 317 |
printk_once(KERN_WARNING "%s (%d): " "Attempt to access syslog with CAP_SYS_ADMIN " "but no CAP_SYSLOG (deprecated). ", current->comm, task_pid_nr(current)); |
ee24aebff cap_syslog: accep... |
318 319 320 321 322 323 |
return 0; } return -EPERM; } return 0; } |
002345925 syslog: distingui... |
324 |
int do_syslog(int type, char __user *buf, int len, bool from_file) |
1da177e4c Linux-2.6.12-rc2 |
325 |
{ |
eed4a2aba printk.c: use uns... |
326 |
unsigned i, j, limit, count; |
1da177e4c Linux-2.6.12-rc2 |
327 328 |
int do_clear = 0; char c; |
ee24aebff cap_syslog: accep... |
329 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
330 |
|
ee24aebff cap_syslog: accep... |
331 332 333 |
error = check_syslog_permissions(type, from_file); if (error) goto out; |
12b3052c3 capabilities/sysl... |
334 335 |
error = security_syslog(type); |
1da177e4c Linux-2.6.12-rc2 |
336 337 338 339 |
if (error) return error; switch (type) { |
d78ca3cd7 syslog: use defin... |
340 |
case SYSLOG_ACTION_CLOSE: /* Close log */ |
1da177e4c Linux-2.6.12-rc2 |
341 |
break; |
d78ca3cd7 syslog: use defin... |
342 |
case SYSLOG_ACTION_OPEN: /* Open log */ |
1da177e4c Linux-2.6.12-rc2 |
343 |
break; |
d78ca3cd7 syslog: use defin... |
344 |
case SYSLOG_ACTION_READ: /* Read from log */ |
1da177e4c Linux-2.6.12-rc2 |
345 346 347 348 349 350 351 352 353 354 |
error = -EINVAL; if (!buf || len < 0) goto out; error = 0; if (!len) goto out; if (!access_ok(VERIFY_WRITE, buf, len)) { error = -EFAULT; goto out; } |
40dc56512 [PATCH] cleanup f... |
355 356 |
error = wait_event_interruptible(log_wait, (log_start - log_end)); |
1da177e4c Linux-2.6.12-rc2 |
357 358 359 |
if (error) goto out; i = 0; |
07354eb1a locking, printk: ... |
360 |
raw_spin_lock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
361 362 363 |
while (!error && (log_start != log_end) && i < len) { c = LOG_BUF(log_start); log_start++; |
07354eb1a locking, printk: ... |
364 |
raw_spin_unlock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
365 366 367 368 |
error = __put_user(c,buf); buf++; i++; cond_resched(); |
07354eb1a locking, printk: ... |
369 |
raw_spin_lock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
370 |
} |
07354eb1a locking, printk: ... |
371 |
raw_spin_unlock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
372 373 374 |
if (!error) error = i; break; |
d78ca3cd7 syslog: use defin... |
375 376 |
/* Read/clear last kernel messages */ case SYSLOG_ACTION_READ_CLEAR: |
40dc56512 [PATCH] cleanup f... |
377 |
do_clear = 1; |
1da177e4c Linux-2.6.12-rc2 |
378 |
/* FALL THRU */ |
d78ca3cd7 syslog: use defin... |
379 380 |
/* Read last kernel messages */ case SYSLOG_ACTION_READ_ALL: |
1da177e4c Linux-2.6.12-rc2 |
381 382 383 384 385 386 387 388 389 390 391 392 393 |
error = -EINVAL; if (!buf || len < 0) goto out; error = 0; if (!len) goto out; if (!access_ok(VERIFY_WRITE, buf, len)) { error = -EFAULT; goto out; } count = len; if (count > log_buf_len) count = log_buf_len; |
07354eb1a locking, printk: ... |
394 |
raw_spin_lock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
395 396 397 398 399 400 401 |
if (count > logged_chars) count = logged_chars; if (do_clear) logged_chars = 0; limit = log_end; /* * __put_user() could sleep, and while we sleep |
40dc56512 [PATCH] cleanup f... |
402 |
* printk() could overwrite the messages |
1da177e4c Linux-2.6.12-rc2 |
403 404 405 |
* we try to copy to user space. Therefore * the messages are copied in reverse. <manfreds> */ |
40dc56512 [PATCH] cleanup f... |
406 |
for (i = 0; i < count && !error; i++) { |
1da177e4c Linux-2.6.12-rc2 |
407 408 409 410 |
j = limit-1-i; if (j + log_buf_len < log_end) break; c = LOG_BUF(j); |
07354eb1a locking, printk: ... |
411 |
raw_spin_unlock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
412 413 |
error = __put_user(c,&buf[count-1-i]); cond_resched(); |
07354eb1a locking, printk: ... |
414 |
raw_spin_lock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
415 |
} |
07354eb1a locking, printk: ... |
416 |
raw_spin_unlock_irq(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
417 418 419 |
if (error) break; error = i; |
40dc56512 [PATCH] cleanup f... |
420 |
if (i != count) { |
1da177e4c Linux-2.6.12-rc2 |
421 422 |
int offset = count-error; /* buffer overflow during copy, correct user buffer. */ |
40dc56512 [PATCH] cleanup f... |
423 |
for (i = 0; i < error; i++) { |
1da177e4c Linux-2.6.12-rc2 |
424 425 426 427 428 429 430 431 432 |
if (__get_user(c,&buf[i+offset]) || __put_user(c,&buf[i])) { error = -EFAULT; break; } cond_resched(); } } break; |
d78ca3cd7 syslog: use defin... |
433 434 |
/* Clear ring buffer */ case SYSLOG_ACTION_CLEAR: |
1da177e4c Linux-2.6.12-rc2 |
435 436 |
logged_chars = 0; break; |
d78ca3cd7 syslog: use defin... |
437 438 |
/* Disable logging to console */ case SYSLOG_ACTION_CONSOLE_OFF: |
1aaad49e8 printk: Restore p... |
439 440 |
if (saved_console_loglevel == -1) saved_console_loglevel = console_loglevel; |
1da177e4c Linux-2.6.12-rc2 |
441 442 |
console_loglevel = minimum_console_loglevel; break; |
d78ca3cd7 syslog: use defin... |
443 444 |
/* Enable logging to console */ case SYSLOG_ACTION_CONSOLE_ON: |
1aaad49e8 printk: Restore p... |
445 446 447 448 |
if (saved_console_loglevel != -1) { console_loglevel = saved_console_loglevel; saved_console_loglevel = -1; } |
1da177e4c Linux-2.6.12-rc2 |
449 |
break; |
d78ca3cd7 syslog: use defin... |
450 451 |
/* Set level of messages printed to console */ case SYSLOG_ACTION_CONSOLE_LEVEL: |
1da177e4c Linux-2.6.12-rc2 |
452 453 454 455 456 457 |
error = -EINVAL; if (len < 1 || len > 8) goto out; if (len < minimum_console_loglevel) len = minimum_console_loglevel; console_loglevel = len; |
1aaad49e8 printk: Restore p... |
458 459 |
/* Implicitly re-enable logging to console */ saved_console_loglevel = -1; |
1da177e4c Linux-2.6.12-rc2 |
460 461 |
error = 0; break; |
d78ca3cd7 syslog: use defin... |
462 463 |
/* Number of chars in the log buffer */ case SYSLOG_ACTION_SIZE_UNREAD: |
1da177e4c Linux-2.6.12-rc2 |
464 465 |
error = log_end - log_start; break; |
d78ca3cd7 syslog: use defin... |
466 467 |
/* Size of the log buffer */ case SYSLOG_ACTION_SIZE_BUFFER: |
1da177e4c Linux-2.6.12-rc2 |
468 469 470 471 472 473 474 475 476 |
error = log_buf_len; break; default: error = -EINVAL; break; } out: return error; } |
1e7bfb213 [CVE-2009-0029] S... |
477 |
SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) |
1da177e4c Linux-2.6.12-rc2 |
478 |
{ |
002345925 syslog: distingui... |
479 |
return do_syslog(type, buf, len, SYSLOG_FROM_CALL); |
1da177e4c Linux-2.6.12-rc2 |
480 |
} |
67fc4e0cb kdb: core for kgd... |
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 |
#ifdef CONFIG_KGDB_KDB /* kdb dmesg command needs access to the syslog buffer. do_syslog() * uses locks so it cannot be used during debugging. Just tell kdb * where the start and end of the physical and logical logs are. This * is equivalent to do_syslog(3). */ void kdb_syslog_data(char *syslog_data[4]) { syslog_data[0] = log_buf; syslog_data[1] = log_buf + log_buf_len; syslog_data[2] = log_buf + log_end - (logged_chars < log_buf_len ? logged_chars : log_buf_len); syslog_data[3] = log_buf + log_end; } #endif /* CONFIG_KGDB_KDB */ |
1da177e4c Linux-2.6.12-rc2 |
496 497 498 |
/* * Call the console drivers on a range of log_buf */ |
eed4a2aba printk.c: use uns... |
499 |
static void __call_console_drivers(unsigned start, unsigned end) |
1da177e4c Linux-2.6.12-rc2 |
500 501 |
{ struct console *con; |
4d0916119 printk: Enable th... |
502 |
for_each_console(con) { |
fe3d8ad31 console: prevent ... |
503 504 |
if (exclusive_console && con != exclusive_console) continue; |
76a8ad293 [PATCH] Make prin... |
505 506 507 |
if ((con->flags & CON_ENABLED) && con->write && (cpu_online(smp_processor_id()) || (con->flags & CON_ANYTIME))) |
1da177e4c Linux-2.6.12-rc2 |
508 509 510 |
con->write(con, &LOG_BUF(start), end - start); } } |
2329abfa3 module_param: mak... |
511 |
static bool __read_mostly ignore_loglevel; |
792908225 [PATCH] add ignor... |
512 |
|
99eea6a10 [PATCH] make kern... |
513 |
static int __init ignore_loglevel_setup(char *str) |
792908225 [PATCH] add ignor... |
514 515 516 517 |
{ ignore_loglevel = 1; printk(KERN_INFO "debug: ignoring loglevel setting. "); |
c4772d993 debug: turn ignor... |
518 |
return 0; |
792908225 [PATCH] add ignor... |
519 |
} |
c4772d993 debug: turn ignor... |
520 |
early_param("ignore_loglevel", ignore_loglevel_setup); |
29d4d6df1 printk: fix unnec... |
521 |
module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR); |
0eca6b7c7 printk: add modul... |
522 523 |
MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to" "print all kernel messages to the console."); |
792908225 [PATCH] add ignor... |
524 |
|
1da177e4c Linux-2.6.12-rc2 |
525 526 527 |
/* * Write out chars from start to end - 1 inclusive */ |
eed4a2aba printk.c: use uns... |
528 529 |
static void _call_console_drivers(unsigned start, unsigned end, int msg_log_level) |
1da177e4c Linux-2.6.12-rc2 |
530 |
{ |
792908225 [PATCH] add ignor... |
531 |
if ((msg_log_level < console_loglevel || ignore_loglevel) && |
1da177e4c Linux-2.6.12-rc2 |
532 533 534 535 536 537 538 539 540 541 542 543 544 |
console_drivers && start != end) { if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) { /* wrapped write */ __call_console_drivers(start & LOG_BUF_MASK, log_buf_len); __call_console_drivers(0, end & LOG_BUF_MASK); } else { __call_console_drivers(start, end); } } } /* |
9d90c8d9c printk: do not ma... |
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 |
* Parse the syslog header <[0-9]*>. The decimal value represents 32bit, the * lower 3 bit are the log level, the rest are the log facility. In case * userspace passes usual userspace syslog messages to /dev/kmsg or * /dev/ttyprintk, the log prefix might contain the facility. Printk needs * to extract the correct log level for in-kernel processing, and not mangle * the original value. * * If a prefix is found, the length of the prefix is returned. If 'level' is * passed, it will be filled in with the log level without a possible facility * value. If 'special' is passed, the special printk prefix chars are accepted * and returned. If no valid header is found, 0 is returned and the passed * variables are not touched. */ static size_t log_prefix(const char *p, unsigned int *level, char *special) { unsigned int lev = 0; char sp = '\0'; size_t len; if (p[0] != '<' || !p[1]) return 0; if (p[2] == '>') { /* usual single digit level number or special char */ switch (p[1]) { case '0' ... '7': lev = p[1] - '0'; break; case 'c': /* KERN_CONT */ case 'd': /* KERN_DEFAULT */ sp = p[1]; break; default: return 0; } len = 3; } else { /* multi digit including the level and facility number */ char *endp = NULL; |
9d90c8d9c printk: do not ma... |
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
lev = (simple_strtoul(&p[1], &endp, 10) & 7); if (endp == NULL || endp[0] != '>') return 0; len = (endp + 1) - p; } /* do not accept special char if not asked for */ if (sp && !special) return 0; if (special) { *special = sp; /* return special char, do not touch level */ if (sp) return len; } if (level) *level = lev; return len; } /* |
1da177e4c Linux-2.6.12-rc2 |
606 607 |
* Call the console drivers, asking them to write out * log_buf[start] to log_buf[end - 1]. |
ac751efa6 console: rename a... |
608 |
* The console_lock must be held. |
1da177e4c Linux-2.6.12-rc2 |
609 |
*/ |
eed4a2aba printk.c: use uns... |
610 |
static void call_console_drivers(unsigned start, unsigned end) |
1da177e4c Linux-2.6.12-rc2 |
611 |
{ |
eed4a2aba printk.c: use uns... |
612 |
unsigned cur_index, start_print; |
1da177e4c Linux-2.6.12-rc2 |
613 |
static int msg_level = -1; |
eed4a2aba printk.c: use uns... |
614 |
BUG_ON(((int)(start - end)) > 0); |
1da177e4c Linux-2.6.12-rc2 |
615 616 617 618 |
cur_index = start; start_print = start; while (cur_index != end) { |
9d90c8d9c printk: do not ma... |
619 620 621 |
if (msg_level < 0 && ((end - cur_index) > 2)) { /* strip log prefix */ cur_index += log_prefix(&LOG_BUF(cur_index), &msg_level, NULL); |
1da177e4c Linux-2.6.12-rc2 |
622 623 624 625 |
start_print = cur_index; } while (cur_index != end) { char c = LOG_BUF(cur_index); |
1da177e4c Linux-2.6.12-rc2 |
626 |
|
40dc56512 [PATCH] cleanup f... |
627 |
cur_index++; |
1da177e4c Linux-2.6.12-rc2 |
628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 |
if (c == ' ') { if (msg_level < 0) { /* * printk() has already given us loglevel tags in * the buffer. This code is here in case the * log buffer has wrapped right round and scribbled * on those tags */ msg_level = default_message_loglevel; } _call_console_drivers(start_print, cur_index, msg_level); msg_level = -1; start_print = cur_index; break; } } } _call_console_drivers(start_print, end, msg_level); } static void emit_log_char(char c) { LOG_BUF(log_end) = c; log_end++; if (log_end - log_start > log_buf_len) log_start = log_end - log_buf_len; if (log_end - con_start > log_buf_len) con_start = log_end - log_buf_len; if (logged_chars < log_buf_len) logged_chars++; } /* * Zap console related locks when oopsing. Only zap at most once * every 10 seconds, to leave time for slow consoles to print a * full oops. */ static void zap_locks(void) { static unsigned long oops_timestamp; if (time_after_eq(jiffies, oops_timestamp) && |
40dc56512 [PATCH] cleanup f... |
671 |
!time_after(jiffies, oops_timestamp + 30 * HZ)) |
1da177e4c Linux-2.6.12-rc2 |
672 673 674 |
return; oops_timestamp = jiffies; |
94d24fc47 printk, lockdep: ... |
675 |
debug_locks_off(); |
1da177e4c Linux-2.6.12-rc2 |
676 |
/* If a crash is occurring, make sure we can't deadlock */ |
07354eb1a locking, printk: ... |
677 |
raw_spin_lock_init(&logbuf_lock); |
1da177e4c Linux-2.6.12-rc2 |
678 |
/* And make sure that we print immediately */ |
5b8c4f23c printk: Make cons... |
679 |
sema_init(&console_sem, 1); |
1da177e4c Linux-2.6.12-rc2 |
680 681 682 |
} #if defined(CONFIG_PRINTK_TIME) |
2329abfa3 module_param: mak... |
683 |
static bool printk_time = 1; |
1da177e4c Linux-2.6.12-rc2 |
684 |
#else |
2329abfa3 module_param: mak... |
685 |
static bool printk_time = 0; |
1da177e4c Linux-2.6.12-rc2 |
686 |
#endif |
e84845c4b add printk.time o... |
687 |
module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); |
1da177e4c Linux-2.6.12-rc2 |
688 |
|
76a8ad293 [PATCH] Make prin... |
689 690 691 692 |
/* Check if we have any console registered that can be called early in boot. */ static int have_callable_console(void) { struct console *con; |
4d0916119 printk: Enable th... |
693 |
for_each_console(con) |
76a8ad293 [PATCH] Make prin... |
694 695 696 697 698 |
if (con->flags & CON_ANYTIME) return 1; return 0; } |
ddad86c2d [PATCH] DocBook: ... |
699 700 701 702 |
/** * printk - print a kernel message * @fmt: format string * |
72fd4a35a [PATCH] Numerous ... |
703 |
* This is printk(). It can be called from any context. We want it to work. |
40dc56512 [PATCH] cleanup f... |
704 |
* |
ac751efa6 console: rename a... |
705 |
* We try to grab the console_lock. If we succeed, it's easy - we log the output and |
1da177e4c Linux-2.6.12-rc2 |
706 707 |
* call the console drivers. If we fail to get the semaphore we place the output * into the log buffer and return. The current holder of the console_sem will |
ac751efa6 console: rename a... |
708 709 |
* notice the new output in console_unlock(); and will send it to the * consoles before releasing the lock. |
1da177e4c Linux-2.6.12-rc2 |
710 711 712 713 |
* * One effect of this deferred printing is that code which calls printk() and * then changes console_loglevel may break. This is because console_loglevel * is inspected when the actual printing occurs. |
ddad86c2d [PATCH] DocBook: ... |
714 715 716 |
* * See also: * printf(3) |
20036fdca Add kerneldoc doc... |
717 718 |
* * See the vsnprintf() documentation for format string extensions over C99. |
1da177e4c Linux-2.6.12-rc2 |
719 |
*/ |
d59745ce3 [PATCH] clean up ... |
720 |
|
1da177e4c Linux-2.6.12-rc2 |
721 722 723 724 |
asmlinkage int printk(const char *fmt, ...) { va_list args; int r; |
d37d39ae3 printk,kdb: captu... |
725 726 727 728 729 730 731 732 |
#ifdef CONFIG_KGDB_KDB if (unlikely(kdb_trap_printk)) { va_start(args, fmt); r = vkdb_printf(fmt, args); va_end(args); return r; } #endif |
1da177e4c Linux-2.6.12-rc2 |
733 734 735 736 737 738 |
va_start(args, fmt); r = vprintk(fmt, args); va_end(args); return r; } |
fe21773d6 [PATCH] Provide b... |
739 740 |
/* cpu currently holding logbuf_lock */ static volatile unsigned int printk_cpu = UINT_MAX; |
266c2e0ab Make printk() con... |
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 |
/* * Can we actually use the console at this time on this cpu? * * Console drivers may assume that per-cpu resources have * been allocated. So unless they're explicitly marked as * being able to cope (CON_ANYTIME) don't call them until * this CPU is officially up. */ static inline int can_use_console(unsigned int cpu) { return cpu_online(cpu) || have_callable_console(); } /* * Try to get console ownership to actually show the kernel * messages from a 'printk'. Return true (and with the |
ac751efa6 console: rename a... |
757 |
* console_lock held, and 'console_locked' set) if it |
266c2e0ab Make printk() con... |
758 759 760 761 762 763 |
* is successful, false otherwise. * * This gets called with the 'logbuf_lock' spinlock held and * interrupts disabled. It should return with 'lockbuf_lock' * released but interrupts still disabled. */ |
ac751efa6 console: rename a... |
764 |
static int console_trylock_for_printk(unsigned int cpu) |
8155c02a4 printk: add lock ... |
765 |
__releases(&logbuf_lock) |
266c2e0ab Make printk() con... |
766 |
{ |
0b5e1c525 printk: Release c... |
767 |
int retval = 0, wake = 0; |
266c2e0ab Make printk() con... |
768 |
|
ac751efa6 console: rename a... |
769 |
if (console_trylock()) { |
093a07e2f Fix locking bug i... |
770 771 772 773 774 775 776 777 778 779 |
retval = 1; /* * If we can't use the console, we need to release * the console semaphore by hand to avoid flushing * the buffer. We need to hold the console semaphore * in order to do this test safely. */ if (!can_use_console(cpu)) { console_locked = 0; |
0b5e1c525 printk: Release c... |
780 |
wake = 1; |
093a07e2f Fix locking bug i... |
781 782 783 |
retval = 0; } } |
266c2e0ab Make printk() con... |
784 |
printk_cpu = UINT_MAX; |
0b5e1c525 printk: Release c... |
785 786 |
if (wake) up(&console_sem); |
07354eb1a locking, printk: ... |
787 |
raw_spin_unlock(&logbuf_lock); |
266c2e0ab Make printk() con... |
788 789 |
return retval; } |
3b8945e8d printk: clean up ... |
790 791 792 793 |
static const char recursion_bug_msg [] = KERN_CRIT "BUG: recent printk recursion! "; static int recursion_bug; |
edb123e16 trivial: printk: ... |
794 |
static int new_text_line = 1; |
3b8945e8d printk: clean up ... |
795 |
static char printk_buf[1024]; |
32a760066 printk: make prin... |
796 |
|
af91322ef printk: add print... |
797 798 799 800 801 802 803 804 805 806 807 808 809 |
int printk_delay_msec __read_mostly; static inline void printk_delay(void) { if (unlikely(printk_delay_msec)) { int m = printk_delay_msec; while (m--) { mdelay(1); touch_nmi_watchdog(); } } } |
1da177e4c Linux-2.6.12-rc2 |
810 811 |
asmlinkage int vprintk(const char *fmt, va_list args) { |
32a760066 printk: make prin... |
812 |
int printed_len = 0; |
091593080 printk: remember ... |
813 |
int current_log_level = default_message_loglevel; |
ac60ad741 printk: refactor ... |
814 |
unsigned long flags; |
32a760066 printk: make prin... |
815 |
int this_cpu; |
1da177e4c Linux-2.6.12-rc2 |
816 |
char *p; |
9d90c8d9c printk: do not ma... |
817 818 |
size_t plen; char special; |
1da177e4c Linux-2.6.12-rc2 |
819 |
|
bfe8df3d3 slow down printk ... |
820 |
boot_delay_msec(); |
af91322ef printk: add print... |
821 |
printk_delay(); |
bfe8df3d3 slow down printk ... |
822 |
|
1da177e4c Linux-2.6.12-rc2 |
823 |
/* This stops the holder of console_sem just where we want him */ |
1a9a8aefa printk, lockdep: ... |
824 |
local_irq_save(flags); |
32a760066 printk: make prin... |
825 826 827 828 829 830 831 832 833 834 835 836 837 |
this_cpu = smp_processor_id(); /* * Ouch, printk recursed into itself! */ if (unlikely(printk_cpu == this_cpu)) { /* * If a crash is occurring during printk() on this CPU, * then try to get the crash message out but make sure * we can't deadlock. Otherwise just return to avoid the * recursion and return - but flag the recursion so that * it can be printed at the next appropriate moment: */ |
94d24fc47 printk, lockdep: ... |
838 |
if (!oops_in_progress && !lockdep_recursing(current)) { |
3b8945e8d printk: clean up ... |
839 |
recursion_bug = 1; |
32a760066 printk: make prin... |
840 841 842 843 |
goto out_restore_irqs; } zap_locks(); } |
a0f1ccfd8 [PATCH] lockdep: ... |
844 |
lockdep_off(); |
07354eb1a locking, printk: ... |
845 |
raw_spin_lock(&logbuf_lock); |
32a760066 printk: make prin... |
846 |
printk_cpu = this_cpu; |
1da177e4c Linux-2.6.12-rc2 |
847 |
|
3b8945e8d printk: clean up ... |
848 849 850 |
if (recursion_bug) { recursion_bug = 0; strcpy(printk_buf, recursion_bug_msg); |
26cc271db printk: fix disca... |
851 |
printed_len = strlen(recursion_bug_msg); |
32a760066 printk: make prin... |
852 |
} |
1da177e4c Linux-2.6.12-rc2 |
853 |
/* Emit the output into the temporary buffer */ |
32a760066 printk: make prin... |
854 |
printed_len += vscnprintf(printk_buf + printed_len, |
cf3680b90 printk: fix possi... |
855 |
sizeof(printk_buf) - printed_len, fmt, args); |
1da177e4c Linux-2.6.12-rc2 |
856 |
|
5fd29d6cc printk: clean up ... |
857 |
p = printk_buf; |
9d90c8d9c printk: do not ma... |
858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 |
/* Read log level and handle special printk prefix */ plen = log_prefix(p, ¤t_log_level, &special); if (plen) { p += plen; switch (special) { case 'c': /* Strip <c> KERN_CONT, continue line */ plen = 0; break; case 'd': /* Strip <d> KERN_DEFAULT, start new line */ plen = 0; default: if (!new_text_line) { emit_log_char(' '); new_text_line = 1; |
5fd29d6cc printk: clean up ... |
874 875 876 |
} } } |
1da177e4c Linux-2.6.12-rc2 |
877 |
/* |
9d90c8d9c printk: do not ma... |
878 879 |
* Copy the output into log_buf. If the caller didn't provide * the appropriate log prefix, we insert them here |
1da177e4c Linux-2.6.12-rc2 |
880 |
*/ |
9d90c8d9c printk: do not ma... |
881 |
for (; *p; p++) { |
ac60ad741 printk: refactor ... |
882 |
if (new_text_line) { |
ac60ad741 printk: refactor ... |
883 |
new_text_line = 0; |
9d90c8d9c printk: do not ma... |
884 885 886 887 888 889 890 891 892 893 894 895 896 897 |
if (plen) { /* Copy original log prefix */ int i; for (i = 0; i < plen; i++) emit_log_char(printk_buf[i]); printed_len += plen; } else { /* Add log prefix */ emit_log_char('<'); emit_log_char(current_log_level + '0'); emit_log_char('>'); printed_len += 3; } |
1da177e4c Linux-2.6.12-rc2 |
898 |
if (printk_time) { |
9d90c8d9c printk: do not ma... |
899 |
/* Add the current time stamp */ |
1da177e4c Linux-2.6.12-rc2 |
900 901 902 903 |
char tbuf[50], *tp; unsigned tlen; unsigned long long t; unsigned long nanosec_rem; |
326e96b92 printk: revert kt... |
904 |
t = cpu_clock(printk_cpu); |
1da177e4c Linux-2.6.12-rc2 |
905 |
nanosec_rem = do_div(t, 1000000000); |
ac60ad741 printk: refactor ... |
906 907 908 |
tlen = sprintf(tbuf, "[%5lu.%06lu] ", (unsigned long) t, nanosec_rem / 1000); |
1da177e4c Linux-2.6.12-rc2 |
909 910 911 |
for (tp = tbuf; tp < tbuf + tlen; tp++) emit_log_char(*tp); |
025510cd2 [PATCH] printk re... |
912 |
printed_len += tlen; |
1da177e4c Linux-2.6.12-rc2 |
913 |
} |
ac60ad741 printk: refactor ... |
914 |
|
1da177e4c Linux-2.6.12-rc2 |
915 916 917 |
if (!*p) break; } |
ac60ad741 printk: refactor ... |
918 |
|
1da177e4c Linux-2.6.12-rc2 |
919 920 921 |
emit_log_char(*p); if (*p == ' ') |
ac60ad741 printk: refactor ... |
922 |
new_text_line = 1; |
1da177e4c Linux-2.6.12-rc2 |
923 |
} |
266c2e0ab Make printk() con... |
924 925 926 927 928 929 |
/* * Try to acquire and then immediately release the * console semaphore. The release will do all the * actual magic (print out buffers, wake up klogd, * etc). * |
ac751efa6 console: rename a... |
930 |
* The console_trylock_for_printk() function |
266c2e0ab Make printk() con... |
931 932 933 |
* will release 'logbuf_lock' regardless of whether it * actually gets the semaphore or not. */ |
ac751efa6 console: rename a... |
934 935 |
if (console_trylock_for_printk(this_cpu)) console_unlock(); |
76a8ad293 [PATCH] Make prin... |
936 |
|
266c2e0ab Make printk() con... |
937 |
lockdep_on(); |
32a760066 printk: make prin... |
938 |
out_restore_irqs: |
1a9a8aefa printk, lockdep: ... |
939 |
local_irq_restore(flags); |
76a8ad293 [PATCH] Make prin... |
940 |
|
1da177e4c Linux-2.6.12-rc2 |
941 942 943 944 |
return printed_len; } EXPORT_SYMBOL(printk); EXPORT_SYMBOL(vprintk); |
d59745ce3 [PATCH] clean up ... |
945 |
#else |
eed4a2aba printk.c: use uns... |
946 |
static void call_console_drivers(unsigned start, unsigned end) |
40dc56512 [PATCH] cleanup f... |
947 948 |
{ } |
d59745ce3 [PATCH] clean up ... |
949 950 |
#endif |
f7511d5f6 Basic braille scr... |
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 |
static int __add_preferred_console(char *name, int idx, char *options, char *brl_options) { struct console_cmdline *c; int i; /* * See if this tty is not yet registered, and * if we have a slot free. */ for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) if (strcmp(console_cmdline[i].name, name) == 0 && console_cmdline[i].index == idx) { if (!brl_options) selected_console = i; return 0; } if (i == MAX_CMDLINECONSOLES) return -E2BIG; if (!brl_options) selected_console = i; c = &console_cmdline[i]; strlcpy(c->name, name, sizeof(c->name)); c->options = options; #ifdef CONFIG_A11Y_BRAILLE_CONSOLE c->brl_options = brl_options; #endif c->index = idx; return 0; } |
2ea1c5392 [PATCH] console_s... |
981 982 983 984 985 |
/* * Set up a list of consoles. Called from init/main.c */ static int __init console_setup(char *str) { |
eaa944afb console: more buf... |
986 |
char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */ |
f7511d5f6 Basic braille scr... |
987 |
char *s, *options, *brl_options = NULL; |
2ea1c5392 [PATCH] console_s... |
988 |
int idx; |
f7511d5f6 Basic braille scr... |
989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE if (!memcmp(str, "brl,", 4)) { brl_options = ""; str += 4; } else if (!memcmp(str, "brl=", 4)) { brl_options = str + 4; str = strchr(brl_options, ','); if (!str) { printk(KERN_ERR "need port name after brl= "); return 1; } *(str++) = 0; } #endif |
2ea1c5392 [PATCH] console_s... |
1004 1005 1006 1007 |
/* * Decode str into name, index, options. */ if (str[0] >= '0' && str[0] <= '9') { |
eaa944afb console: more buf... |
1008 1009 |
strcpy(buf, "ttyS"); strncpy(buf + 4, str, sizeof(buf) - 5); |
2ea1c5392 [PATCH] console_s... |
1010 |
} else { |
eaa944afb console: more buf... |
1011 |
strncpy(buf, str, sizeof(buf) - 1); |
2ea1c5392 [PATCH] console_s... |
1012 |
} |
eaa944afb console: more buf... |
1013 |
buf[sizeof(buf) - 1] = 0; |
2ea1c5392 [PATCH] console_s... |
1014 1015 1016 1017 |
if ((options = strchr(str, ',')) != NULL) *(options++) = 0; #ifdef __sparc__ if (!strcmp(str, "ttya")) |
eaa944afb console: more buf... |
1018 |
strcpy(buf, "ttyS0"); |
2ea1c5392 [PATCH] console_s... |
1019 |
if (!strcmp(str, "ttyb")) |
eaa944afb console: more buf... |
1020 |
strcpy(buf, "ttyS1"); |
2ea1c5392 [PATCH] console_s... |
1021 |
#endif |
eaa944afb console: more buf... |
1022 |
for (s = buf; *s; s++) |
2ea1c5392 [PATCH] console_s... |
1023 1024 1025 1026 |
if ((*s >= '0' && *s <= '9') || *s == ',') break; idx = simple_strtoul(s, NULL, 10); *s = 0; |
f7511d5f6 Basic braille scr... |
1027 |
__add_preferred_console(buf, idx, options, brl_options); |
9e124fe16 xen: Enable conso... |
1028 |
console_set_on_cmdline = 1; |
2ea1c5392 [PATCH] console_s... |
1029 1030 1031 |
return 1; } __setup("console=", console_setup); |
1da177e4c Linux-2.6.12-rc2 |
1032 |
/** |
3c0547ba8 [PATCH] add_prefe... |
1033 |
* add_preferred_console - add a device to the list of preferred consoles. |
ddad86c2d [PATCH] DocBook: ... |
1034 1035 1036 |
* @name: device name * @idx: device index * @options: options for this console |
3c0547ba8 [PATCH] add_prefe... |
1037 1038 1039 1040 1041 1042 1043 1044 |
* * The last preferred console added will be used for kernel messages * and stdin/out/err for init. Normally this is used by console_setup * above to handle user-supplied console arguments; however it can also * be used by arch-specific code either to override the user or more * commonly to provide a default console (ie from PROM variables) when * the user has not supplied one. */ |
fb445ee5f [SERIAL]: Fix sec... |
1045 |
int add_preferred_console(char *name, int idx, char *options) |
3c0547ba8 [PATCH] add_prefe... |
1046 |
{ |
f7511d5f6 Basic braille scr... |
1047 |
return __add_preferred_console(name, idx, options, NULL); |
3c0547ba8 [PATCH] add_prefe... |
1048 |
} |
b6b1d8778 serial: fix 8250 ... |
1049 |
int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options) |
18a8bd949 serial: convert e... |
1050 1051 1052 1053 1054 1055 1056 1057 |
{ struct console_cmdline *c; int i; for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) if (strcmp(console_cmdline[i].name, name) == 0 && console_cmdline[i].index == idx) { c = &console_cmdline[i]; |
f735295b1 printk: don't rea... |
1058 |
strlcpy(c->name, name_new, sizeof(c->name)); |
18a8bd949 serial: convert e... |
1059 1060 1061 1062 1063 1064 1065 1066 |
c->name[sizeof(c->name) - 1] = 0; c->options = options; c->index = idx_new; return i; } /* not found */ return -1; } |
2329abfa3 module_param: mak... |
1067 |
bool console_suspend_enabled = 1; |
8f4ce8c32 serial: turn seri... |
1068 1069 1070 1071 1072 1073 1074 1075 |
EXPORT_SYMBOL(console_suspend_enabled); static int __init console_suspend_disable(char *str) { console_suspend_enabled = 0; return 1; } __setup("no_console_suspend", console_suspend_disable); |
134620f7a printk: add conso... |
1076 1077 1078 1079 |
module_param_named(console_suspend, console_suspend_enabled, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(console_suspend, "suspend console during suspend" " and hibernate operations"); |
8f4ce8c32 serial: turn seri... |
1080 |
|
3c0547ba8 [PATCH] add_prefe... |
1081 |
/** |
557240b48 Add support for s... |
1082 1083 1084 1085 1086 1087 |
* suspend_console - suspend the console subsystem * * This disables printk() while we go into suspend states */ void suspend_console(void) { |
8f4ce8c32 serial: turn seri... |
1088 1089 |
if (!console_suspend_enabled) return; |
0d63081d4 swsusp: provide u... |
1090 1091 |
printk("Suspending console(s) (use no_console_suspend to debug) "); |
ac751efa6 console: rename a... |
1092 |
console_lock(); |
557240b48 Add support for s... |
1093 |
console_suspended = 1; |
403f30757 PM: Fix suspend_c... |
1094 |
up(&console_sem); |
557240b48 Add support for s... |
1095 1096 1097 1098 |
} void resume_console(void) { |
8f4ce8c32 serial: turn seri... |
1099 1100 |
if (!console_suspend_enabled) return; |
403f30757 PM: Fix suspend_c... |
1101 |
down(&console_sem); |
557240b48 Add support for s... |
1102 |
console_suspended = 0; |
ac751efa6 console: rename a... |
1103 |
console_unlock(); |
557240b48 Add support for s... |
1104 1105 1106 |
} /** |
034260d67 printk: fix delay... |
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 |
* console_cpu_notify - print deferred console messages after CPU hotplug * @self: notifier struct * @action: CPU hotplug event * @hcpu: unused * * If printk() is called from a CPU that is not online yet, the messages * will be spooled but will not show up on the console. This function is * called when a new CPU comes online (or fails to come up), and ensures * that any such output gets printed. */ static int __cpuinit console_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { switch (action) { case CPU_ONLINE: case CPU_DEAD: case CPU_DYING: case CPU_DOWN_FAILED: case CPU_UP_CANCELED: |
ac751efa6 console: rename a... |
1126 1127 |
console_lock(); console_unlock(); |
034260d67 printk: fix delay... |
1128 1129 1130 1131 1132 |
} return NOTIFY_OK; } /** |
ac751efa6 console: rename a... |
1133 |
* console_lock - lock the console system for exclusive use. |
1da177e4c Linux-2.6.12-rc2 |
1134 |
* |
ac751efa6 console: rename a... |
1135 |
* Acquires a lock which guarantees that the caller has |
1da177e4c Linux-2.6.12-rc2 |
1136 1137 1138 1139 |
* exclusive access to the console system and the console_drivers list. * * Can sleep, returns nothing. */ |
ac751efa6 console: rename a... |
1140 |
void console_lock(void) |
1da177e4c Linux-2.6.12-rc2 |
1141 |
{ |
8abd8e298 BUG_ON() Conversi... |
1142 |
BUG_ON(in_interrupt()); |
1da177e4c Linux-2.6.12-rc2 |
1143 |
down(&console_sem); |
403f30757 PM: Fix suspend_c... |
1144 1145 |
if (console_suspended) return; |
1da177e4c Linux-2.6.12-rc2 |
1146 1147 1148 |
console_locked = 1; console_may_schedule = 1; } |
ac751efa6 console: rename a... |
1149 |
EXPORT_SYMBOL(console_lock); |
1da177e4c Linux-2.6.12-rc2 |
1150 |
|
ac751efa6 console: rename a... |
1151 1152 1153 1154 1155 1156 1157 1158 1159 |
/** * console_trylock - try to lock the console system for exclusive use. * * Tried to acquire a lock which guarantees that the caller has * exclusive access to the console system and the console_drivers list. * * returns 1 on success, and 0 on failure to acquire the lock. */ int console_trylock(void) |
1da177e4c Linux-2.6.12-rc2 |
1160 1161 |
{ if (down_trylock(&console_sem)) |
ac751efa6 console: rename a... |
1162 |
return 0; |
403f30757 PM: Fix suspend_c... |
1163 1164 |
if (console_suspended) { up(&console_sem); |
ac751efa6 console: rename a... |
1165 |
return 0; |
403f30757 PM: Fix suspend_c... |
1166 |
} |
1da177e4c Linux-2.6.12-rc2 |
1167 1168 |
console_locked = 1; console_may_schedule = 0; |
ac751efa6 console: rename a... |
1169 |
return 1; |
1da177e4c Linux-2.6.12-rc2 |
1170 |
} |
ac751efa6 console: rename a... |
1171 |
EXPORT_SYMBOL(console_trylock); |
1da177e4c Linux-2.6.12-rc2 |
1172 1173 1174 1175 1176 |
int is_console_locked(void) { return console_locked; } |
1da177e4c Linux-2.6.12-rc2 |
1177 |
|
b845b517b printk: robustify... |
1178 1179 1180 |
static DEFINE_PER_CPU(int, printk_pending); void printk_tick(void) |
e3e8a75d2 [PATCH] Extract a... |
1181 |
{ |
40dc11ffb printk: Use this_... |
1182 1183 |
if (__this_cpu_read(printk_pending)) { __this_cpu_write(printk_pending, 0); |
e3e8a75d2 [PATCH] Extract a... |
1184 |
wake_up_interruptible(&log_wait); |
b845b517b printk: robustify... |
1185 1186 1187 1188 1189 |
} } int printk_needs_cpu(int cpu) { |
40dc11ffb printk: Use this_... |
1190 |
if (cpu_is_offline(cpu)) |
61ab25447 nohz: Fix printk_... |
1191 |
printk_tick(); |
40dc11ffb printk: Use this_... |
1192 |
return __this_cpu_read(printk_pending); |
b845b517b printk: robustify... |
1193 1194 1195 1196 1197 |
} void wake_up_klogd(void) { if (waitqueue_active(&log_wait)) |
49f413834 printk: Fix wake_... |
1198 |
this_cpu_write(printk_pending, 1); |
e3e8a75d2 [PATCH] Extract a... |
1199 |
} |
1da177e4c Linux-2.6.12-rc2 |
1200 |
/** |
ac751efa6 console: rename a... |
1201 |
* console_unlock - unlock the console system |
1da177e4c Linux-2.6.12-rc2 |
1202 |
* |
ac751efa6 console: rename a... |
1203 |
* Releases the console_lock which the caller holds on the console system |
1da177e4c Linux-2.6.12-rc2 |
1204 1205 |
* and the console driver list. * |
ac751efa6 console: rename a... |
1206 1207 1208 |
* While the console_lock was held, console output may have been buffered * by printk(). If this is the case, console_unlock(); emits * the output prior to releasing the lock. |
1da177e4c Linux-2.6.12-rc2 |
1209 1210 1211 |
* * If there is output waiting for klogd, we wake it up. * |
ac751efa6 console: rename a... |
1212 |
* console_unlock(); may be called from any context. |
1da177e4c Linux-2.6.12-rc2 |
1213 |
*/ |
ac751efa6 console: rename a... |
1214 |
void console_unlock(void) |
1da177e4c Linux-2.6.12-rc2 |
1215 1216 |
{ unsigned long flags; |
eed4a2aba printk.c: use uns... |
1217 |
unsigned _con_start, _log_end; |
4f2a8d3cf printk: Fix conso... |
1218 |
unsigned wake_klogd = 0, retry = 0; |
1da177e4c Linux-2.6.12-rc2 |
1219 |
|
557240b48 Add support for s... |
1220 |
if (console_suspended) { |
403f30757 PM: Fix suspend_c... |
1221 |
up(&console_sem); |
557240b48 Add support for s... |
1222 1223 |
return; } |
78944e549 [PATCH] vt: print... |
1224 1225 |
console_may_schedule = 0; |
4f2a8d3cf printk: Fix conso... |
1226 |
again: |
1da177e4c Linux-2.6.12-rc2 |
1227 |
for ( ; ; ) { |
07354eb1a locking, printk: ... |
1228 |
raw_spin_lock_irqsave(&logbuf_lock, flags); |
1da177e4c Linux-2.6.12-rc2 |
1229 1230 1231 1232 1233 1234 |
wake_klogd |= log_start - log_end; if (con_start == log_end) break; /* Nothing to print */ _con_start = con_start; _log_end = log_end; con_start = log_end; /* Flush */ |
07354eb1a locking, printk: ... |
1235 |
raw_spin_unlock(&logbuf_lock); |
81d68a96a ftrace: trace irq... |
1236 |
stop_critical_timings(); /* don't trace print latency */ |
1da177e4c Linux-2.6.12-rc2 |
1237 |
call_console_drivers(_con_start, _log_end); |
81d68a96a ftrace: trace irq... |
1238 |
start_critical_timings(); |
1da177e4c Linux-2.6.12-rc2 |
1239 1240 1241 |
local_irq_restore(flags); } console_locked = 0; |
fe3d8ad31 console: prevent ... |
1242 1243 1244 1245 |
/* Release the exclusive_console once it is used */ if (unlikely(exclusive_console)) exclusive_console = NULL; |
07354eb1a locking, printk: ... |
1246 |
raw_spin_unlock(&logbuf_lock); |
4f2a8d3cf printk: Fix conso... |
1247 |
|
0b5e1c525 printk: Release c... |
1248 |
up(&console_sem); |
4f2a8d3cf printk: Fix conso... |
1249 1250 1251 1252 1253 1254 1255 |
/* * Someone could have filled up the buffer again, so re-check if there's * something to flush. In case we cannot trylock the console_sem again, * there's a new owner and the console_unlock() from them will do the * flush, no worries. */ |
07354eb1a locking, printk: ... |
1256 |
raw_spin_lock(&logbuf_lock); |
4f2a8d3cf printk: Fix conso... |
1257 1258 |
if (con_start != log_end) retry = 1; |
09dc3cf93 printk: avoid dou... |
1259 |
raw_spin_unlock_irqrestore(&logbuf_lock, flags); |
4f2a8d3cf printk: Fix conso... |
1260 1261 |
if (retry && console_trylock()) goto again; |
e3e8a75d2 [PATCH] Extract a... |
1262 1263 |
if (wake_klogd) wake_up_klogd(); |
1da177e4c Linux-2.6.12-rc2 |
1264 |
} |
ac751efa6 console: rename a... |
1265 |
EXPORT_SYMBOL(console_unlock); |
1da177e4c Linux-2.6.12-rc2 |
1266 |
|
ddad86c2d [PATCH] DocBook: ... |
1267 1268 |
/** * console_conditional_schedule - yield the CPU if required |
1da177e4c Linux-2.6.12-rc2 |
1269 1270 1271 1272 1273 |
* * If the console code is currently allowed to sleep, and * if this CPU should yield the CPU to another task, do * so here. * |
ac751efa6 console: rename a... |
1274 |
* Must be called within console_lock();. |
1da177e4c Linux-2.6.12-rc2 |
1275 1276 1277 1278 1279 1280 1281 |
*/ void __sched console_conditional_schedule(void) { if (console_may_schedule) cond_resched(); } EXPORT_SYMBOL(console_conditional_schedule); |
1da177e4c Linux-2.6.12-rc2 |
1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 |
void console_unblank(void) { struct console *c; /* * console_unblank can no longer be called in interrupt context unless * oops_in_progress is set to 1.. */ if (oops_in_progress) { if (down_trylock(&console_sem) != 0) return; } else |
ac751efa6 console: rename a... |
1294 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1295 1296 1297 |
console_locked = 1; console_may_schedule = 0; |
4d0916119 printk: Enable th... |
1298 |
for_each_console(c) |
1da177e4c Linux-2.6.12-rc2 |
1299 1300 |
if ((c->flags & CON_ENABLED) && c->unblank) c->unblank(); |
ac751efa6 console: rename a... |
1301 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1302 |
} |
1da177e4c Linux-2.6.12-rc2 |
1303 1304 1305 1306 1307 1308 1309 1310 |
/* * Return the console tty driver structure and its associated index */ struct tty_driver *console_device(int *index) { struct console *c; struct tty_driver *driver = NULL; |
ac751efa6 console: rename a... |
1311 |
console_lock(); |
4d0916119 printk: Enable th... |
1312 |
for_each_console(c) { |
1da177e4c Linux-2.6.12-rc2 |
1313 1314 1315 1316 1317 1318 |
if (!c->device) continue; driver = c->device(c, index); if (driver) break; } |
ac751efa6 console: rename a... |
1319 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 |
return driver; } /* * Prevent further output on the passed console device so that (for example) * serial drivers can disable console output before suspending a port, and can * re-enable output afterwards. */ void console_stop(struct console *console) { |
ac751efa6 console: rename a... |
1330 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1331 |
console->flags &= ~CON_ENABLED; |
ac751efa6 console: rename a... |
1332 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1333 1334 1335 1336 1337 |
} EXPORT_SYMBOL(console_stop); void console_start(struct console *console) { |
ac751efa6 console: rename a... |
1338 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1339 |
console->flags |= CON_ENABLED; |
ac751efa6 console: rename a... |
1340 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1341 1342 |
} EXPORT_SYMBOL(console_start); |
7bf693951 console: allow to... |
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 |
static int __read_mostly keep_bootcon; static int __init keep_bootcon_setup(char *str) { keep_bootcon = 1; printk(KERN_INFO "debug: skip boot console de-registration. "); return 0; } early_param("keep_bootcon", keep_bootcon_setup); |
1da177e4c Linux-2.6.12-rc2 |
1355 1356 1357 1358 1359 |
/* * The console driver calls this routine during kernel initialization * to register the console printing procedure with printk() and to * print any messages that were printed by the kernel before the * console driver was initialized. |
4d0916119 printk: Enable th... |
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 |
* * This can happen pretty early during the boot process (because of * early_printk) - sometimes before setup_arch() completes - be careful * of what kernel features are used - they may not be initialised yet. * * There are two types of consoles - bootconsoles (early_printk) and * "real" consoles (everything which is not a bootconsole) which are * handled differently. * - Any number of bootconsoles can be registered at any time. * - As soon as a "real" console is registered, all bootconsoles * will be unregistered automatically. * - Once a "real" console is registered, any attempt to register a * bootconsoles will be rejected |
1da177e4c Linux-2.6.12-rc2 |
1373 |
*/ |
4d0916119 printk: Enable th... |
1374 |
void register_console(struct console *newcon) |
1da177e4c Linux-2.6.12-rc2 |
1375 |
{ |
40dc56512 [PATCH] cleanup f... |
1376 |
int i; |
1da177e4c Linux-2.6.12-rc2 |
1377 |
unsigned long flags; |
4d0916119 printk: Enable th... |
1378 |
struct console *bcon = NULL; |
1da177e4c Linux-2.6.12-rc2 |
1379 |
|
4d0916119 printk: Enable th... |
1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 |
/* * before we register a new CON_BOOT console, make sure we don't * already have a valid console */ if (console_drivers && newcon->flags & CON_BOOT) { /* find the last or real console */ for_each_console(bcon) { if (!(bcon->flags & CON_BOOT)) { printk(KERN_INFO "Too late to register bootconsole %s%d ", newcon->name, newcon->index); return; } } |
69331af79 Fixes and cleanup... |
1394 |
} |
4d0916119 printk: Enable th... |
1395 1396 1397 1398 |
if (console_drivers && console_drivers->flags & CON_BOOT) bcon = console_drivers; if (preferred_console < 0 || bcon || !console_drivers) |
1da177e4c Linux-2.6.12-rc2 |
1399 |
preferred_console = selected_console; |
4d0916119 printk: Enable th... |
1400 1401 |
if (newcon->early_setup) newcon->early_setup(); |
18a8bd949 serial: convert e... |
1402 |
|
1da177e4c Linux-2.6.12-rc2 |
1403 1404 1405 1406 1407 1408 |
/* * See if we want to use this console driver. If we * didn't select a console we take the first one * that registers here. */ if (preferred_console < 0) { |
4d0916119 printk: Enable th... |
1409 1410 1411 1412 1413 1414 1415 |
if (newcon->index < 0) newcon->index = 0; if (newcon->setup == NULL || newcon->setup(newcon, NULL) == 0) { newcon->flags |= CON_ENABLED; if (newcon->device) { newcon->flags |= CON_CONSDEV; |
cd3a1b856 printk: don't pre... |
1416 1417 |
preferred_console = 0; } |
1da177e4c Linux-2.6.12-rc2 |
1418 1419 1420 1421 1422 1423 1424 |
} } /* * See if this console matches one we selected on * the command line. */ |
40dc56512 [PATCH] cleanup f... |
1425 1426 |
for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) { |
4d0916119 printk: Enable th... |
1427 |
if (strcmp(console_cmdline[i].name, newcon->name) != 0) |
1da177e4c Linux-2.6.12-rc2 |
1428 |
continue; |
4d0916119 printk: Enable th... |
1429 1430 |
if (newcon->index >= 0 && newcon->index != console_cmdline[i].index) |
1da177e4c Linux-2.6.12-rc2 |
1431 |
continue; |
4d0916119 printk: Enable th... |
1432 1433 |
if (newcon->index < 0) newcon->index = console_cmdline[i].index; |
f7511d5f6 Basic braille scr... |
1434 1435 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE if (console_cmdline[i].brl_options) { |
4d0916119 printk: Enable th... |
1436 1437 |
newcon->flags |= CON_BRL; braille_register_console(newcon, |
f7511d5f6 Basic braille scr... |
1438 1439 1440 1441 1442 1443 |
console_cmdline[i].index, console_cmdline[i].options, console_cmdline[i].brl_options); return; } #endif |
4d0916119 printk: Enable th... |
1444 1445 |
if (newcon->setup && newcon->setup(newcon, console_cmdline[i].options) != 0) |
1da177e4c Linux-2.6.12-rc2 |
1446 |
break; |
4d0916119 printk: Enable th... |
1447 1448 |
newcon->flags |= CON_ENABLED; newcon->index = console_cmdline[i].index; |
ab4af03a4 [PATCH] CON_CONSD... |
1449 |
if (i == selected_console) { |
4d0916119 printk: Enable th... |
1450 |
newcon->flags |= CON_CONSDEV; |
ab4af03a4 [PATCH] CON_CONSD... |
1451 1452 |
preferred_console = selected_console; } |
1da177e4c Linux-2.6.12-rc2 |
1453 1454 |
break; } |
4d0916119 printk: Enable th... |
1455 |
if (!(newcon->flags & CON_ENABLED)) |
1da177e4c Linux-2.6.12-rc2 |
1456 |
return; |
8259cf434 printk: Ensure th... |
1457 1458 1459 1460 1461 1462 1463 |
/* * If we have a bootconsole, and are switching to a real console, * don't print everything out again, since when the boot console, and * the real console are the same physical device, it's annoying to * see the beginning boot messages twice */ if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) |
4d0916119 printk: Enable th... |
1464 |
newcon->flags &= ~CON_PRINTBUFFER; |
1da177e4c Linux-2.6.12-rc2 |
1465 1466 1467 1468 1469 |
/* * Put this console in the list - keep the * preferred driver at the head of the list. */ |
ac751efa6 console: rename a... |
1470 |
console_lock(); |
4d0916119 printk: Enable th... |
1471 1472 1473 1474 1475 |
if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { newcon->next = console_drivers; console_drivers = newcon; if (newcon->next) newcon->next->flags &= ~CON_CONSDEV; |
1da177e4c Linux-2.6.12-rc2 |
1476 |
} else { |
4d0916119 printk: Enable th... |
1477 1478 |
newcon->next = console_drivers->next; console_drivers->next = newcon; |
1da177e4c Linux-2.6.12-rc2 |
1479 |
} |
4d0916119 printk: Enable th... |
1480 |
if (newcon->flags & CON_PRINTBUFFER) { |
1da177e4c Linux-2.6.12-rc2 |
1481 |
/* |
ac751efa6 console: rename a... |
1482 |
* console_unlock(); will print out the buffered messages |
1da177e4c Linux-2.6.12-rc2 |
1483 1484 |
* for us. */ |
07354eb1a locking, printk: ... |
1485 |
raw_spin_lock_irqsave(&logbuf_lock, flags); |
1da177e4c Linux-2.6.12-rc2 |
1486 |
con_start = log_start; |
07354eb1a locking, printk: ... |
1487 |
raw_spin_unlock_irqrestore(&logbuf_lock, flags); |
fe3d8ad31 console: prevent ... |
1488 1489 1490 1491 1492 1493 |
/* * We're about to replay the log buffer. Only do this to the * just-registered console to avoid excessive message spam to * the already-registered consoles. */ exclusive_console = newcon; |
1da177e4c Linux-2.6.12-rc2 |
1494 |
} |
ac751efa6 console: rename a... |
1495 |
console_unlock(); |
fbc92a345 tty: add 'active'... |
1496 |
console_sysfs_notify(); |
8259cf434 printk: Ensure th... |
1497 1498 1499 1500 1501 1502 1503 1504 |
/* * By unregistering the bootconsoles after we enable the real console * we get the "console xxx enabled" message on all the consoles - * boot consoles, real consoles, etc - this is to ensure that end * users know there might be something in the kernel's log buffer that * went to the bootconsole (that they do not see on the real console) */ |
7bf693951 console: allow to... |
1505 1506 1507 |
if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && !keep_bootcon) { |
8259cf434 printk: Ensure th... |
1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 |
/* we need to iterate through twice, to make sure we print * everything out, before we unregister the console(s) */ printk(KERN_INFO "console [%s%d] enabled, bootconsole disabled ", newcon->name, newcon->index); for_each_console(bcon) if (bcon->flags & CON_BOOT) unregister_console(bcon); } else { printk(KERN_INFO "%sconsole [%s%d] enabled ", (newcon->flags & CON_BOOT) ? "boot" : "" , newcon->name, newcon->index); } |
1da177e4c Linux-2.6.12-rc2 |
1523 1524 |
} EXPORT_SYMBOL(register_console); |
40dc56512 [PATCH] cleanup f... |
1525 |
int unregister_console(struct console *console) |
1da177e4c Linux-2.6.12-rc2 |
1526 |
{ |
40dc56512 [PATCH] cleanup f... |
1527 |
struct console *a, *b; |
1da177e4c Linux-2.6.12-rc2 |
1528 |
int res = 1; |
f7511d5f6 Basic braille scr... |
1529 1530 1531 1532 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE if (console->flags & CON_BRL) return braille_unregister_console(console); #endif |
ac751efa6 console: rename a... |
1533 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1534 1535 1536 |
if (console_drivers == console) { console_drivers=console->next; res = 0; |
e9b15b54d [PATCH] Fix crash... |
1537 |
} else if (console_drivers) { |
1da177e4c Linux-2.6.12-rc2 |
1538 1539 1540 1541 1542 1543 |
for (a=console_drivers->next, b=console_drivers ; a; b=a, a=b->next) { if (a == console) { b->next = a->next; res = 0; break; |
40dc56512 [PATCH] cleanup f... |
1544 |
} |
1da177e4c Linux-2.6.12-rc2 |
1545 1546 |
} } |
40dc56512 [PATCH] cleanup f... |
1547 |
|
69331af79 Fixes and cleanup... |
1548 |
/* |
ab4af03a4 [PATCH] CON_CONSD... |
1549 1550 |
* If this isn't the last console and it has CON_CONSDEV set, we * need to set it on the next preferred console. |
1da177e4c Linux-2.6.12-rc2 |
1551 |
*/ |
69331af79 Fixes and cleanup... |
1552 |
if (console_drivers != NULL && console->flags & CON_CONSDEV) |
ab4af03a4 [PATCH] CON_CONSD... |
1553 |
console_drivers->flags |= CON_CONSDEV; |
1da177e4c Linux-2.6.12-rc2 |
1554 |
|
ac751efa6 console: rename a... |
1555 |
console_unlock(); |
fbc92a345 tty: add 'active'... |
1556 |
console_sysfs_notify(); |
1da177e4c Linux-2.6.12-rc2 |
1557 1558 1559 |
return res; } EXPORT_SYMBOL(unregister_console); |
d59745ce3 [PATCH] clean up ... |
1560 |
|
034260d67 printk: fix delay... |
1561 |
static int __init printk_late_init(void) |
0c5564bd9 ensure we don't u... |
1562 |
{ |
4d0916119 printk: Enable th... |
1563 1564 1565 |
struct console *con; for_each_console(con) { |
4c30c6f56 kernel/printk: do... |
1566 |
if (!keep_bootcon && con->flags & CON_BOOT) { |
cb00e99c0 fix - ensure we d... |
1567 1568 |
printk(KERN_INFO "turn off boot console %s%d ", |
4d0916119 printk: Enable th... |
1569 |
con->name, con->index); |
42c2c8c85 printk: Fix "prin... |
1570 |
unregister_console(con); |
cb00e99c0 fix - ensure we d... |
1571 |
} |
0c5564bd9 ensure we don't u... |
1572 |
} |
034260d67 printk: fix delay... |
1573 |
hotcpu_notifier(console_cpu_notify, 0); |
0c5564bd9 ensure we don't u... |
1574 1575 |
return 0; } |
034260d67 printk: fix delay... |
1576 |
late_initcall(printk_late_init); |
0c5564bd9 ensure we don't u... |
1577 |
|
7ef3d2fd1 printk_ratelimit(... |
1578 |
#if defined CONFIG_PRINTK |
717115e1a printk ratelimiti... |
1579 |
|
1da177e4c Linux-2.6.12-rc2 |
1580 1581 1582 |
/* * printk rate limiting, lifted from the networking subsystem. * |
641de9d8f printk: fix comme... |
1583 1584 |
* This enforces a rate limit: not more than 10 kernel messages * every 5s to make a denial-of-service attack impossible. |
1da177e4c Linux-2.6.12-rc2 |
1585 |
*/ |
641de9d8f printk: fix comme... |
1586 |
DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10); |
5c8287133 ratelimit: Make s... |
1587 |
int __printk_ratelimit(const char *func) |
1da177e4c Linux-2.6.12-rc2 |
1588 |
{ |
5c8287133 ratelimit: Make s... |
1589 |
return ___ratelimit(&printk_ratelimit_state, func); |
1da177e4c Linux-2.6.12-rc2 |
1590 |
} |
5c8287133 ratelimit: Make s... |
1591 |
EXPORT_SYMBOL(__printk_ratelimit); |
f46c48335 [PATCH] Add print... |
1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 |
/** * printk_timed_ratelimit - caller-controlled printk ratelimiting * @caller_jiffies: pointer to caller's state * @interval_msecs: minimum interval between prints * * printk_timed_ratelimit() returns true if more than @interval_msecs * milliseconds have elapsed since the last time printk_timed_ratelimit() * returned true. */ bool printk_timed_ratelimit(unsigned long *caller_jiffies, unsigned int interval_msecs) { |
f2d28a2eb printk: correct t... |
1605 1606 1607 1608 1609 |
if (*caller_jiffies == 0 || !time_in_range(jiffies, *caller_jiffies, *caller_jiffies + msecs_to_jiffies(interval_msecs))) { *caller_jiffies = jiffies; |
f46c48335 [PATCH] Add print... |
1610 1611 1612 1613 1614 |
return true; } return false; } EXPORT_SYMBOL(printk_timed_ratelimit); |
456b565cc core: Add kernel ... |
1615 1616 1617 1618 1619 1620 |
static DEFINE_SPINLOCK(dump_list_lock); static LIST_HEAD(dump_list); /** * kmsg_dump_register - register a kernel log dumper. |
6485536bc printk: fix new k... |
1621 |
* @dumper: pointer to the kmsg_dumper structure |
456b565cc core: Add kernel ... |
1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 |
* * Adds a kernel log dumper to the system. The dump callback in the * structure will be called when the kernel oopses or panics and must be * set. Returns zero on success and %-EINVAL or %-EBUSY otherwise. */ int kmsg_dump_register(struct kmsg_dumper *dumper) { unsigned long flags; int err = -EBUSY; /* The dump callback needs to be set */ if (!dumper->dump) return -EINVAL; spin_lock_irqsave(&dump_list_lock, flags); /* Don't allow registering multiple times */ if (!dumper->registered) { dumper->registered = 1; |
fb842b00c printk: use RCU t... |
1640 |
list_add_tail_rcu(&dumper->list, &dump_list); |
456b565cc core: Add kernel ... |
1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 |
err = 0; } spin_unlock_irqrestore(&dump_list_lock, flags); return err; } EXPORT_SYMBOL_GPL(kmsg_dump_register); /** * kmsg_dump_unregister - unregister a kmsg dumper. |
6485536bc printk: fix new k... |
1651 |
* @dumper: pointer to the kmsg_dumper structure |
456b565cc core: Add kernel ... |
1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 |
* * Removes a dump device from the system. Returns zero on success and * %-EINVAL otherwise. */ int kmsg_dump_unregister(struct kmsg_dumper *dumper) { unsigned long flags; int err = -EINVAL; spin_lock_irqsave(&dump_list_lock, flags); if (dumper->registered) { dumper->registered = 0; |
fb842b00c printk: use RCU t... |
1664 |
list_del_rcu(&dumper->list); |
456b565cc core: Add kernel ... |
1665 1666 1667 |
err = 0; } spin_unlock_irqrestore(&dump_list_lock, flags); |
fb842b00c printk: use RCU t... |
1668 |
synchronize_rcu(); |
456b565cc core: Add kernel ... |
1669 1670 1671 1672 |
return err; } EXPORT_SYMBOL_GPL(kmsg_dump_unregister); |
456b565cc core: Add kernel ... |
1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 |
/** * kmsg_dump - dump kernel log to kernel message dumpers. * @reason: the reason (oops, panic etc) for dumping * * Iterate through each of the dump devices and call the oops/panic * callbacks with the log buffer. */ void kmsg_dump(enum kmsg_dump_reason reason) { unsigned long end; unsigned chars; struct kmsg_dumper *dumper; const char *s1, *s2; unsigned long l1, l2; unsigned long flags; /* Theoretically, the log could move on after we do this, but there's not a lot we can do about that. The new messages will overwrite the start of what we dump. */ |
07354eb1a locking, printk: ... |
1692 |
raw_spin_lock_irqsave(&logbuf_lock, flags); |
456b565cc core: Add kernel ... |
1693 1694 |
end = log_end & LOG_BUF_MASK; chars = logged_chars; |
07354eb1a locking, printk: ... |
1695 |
raw_spin_unlock_irqrestore(&logbuf_lock, flags); |
456b565cc core: Add kernel ... |
1696 |
|
8c4af38e9 gcc-4.6: printk: ... |
1697 1698 1699 |
if (chars > end) { s1 = log_buf + log_buf_len - chars + end; l1 = chars - end; |
456b565cc core: Add kernel ... |
1700 1701 1702 1703 1704 1705 |
s2 = log_buf; l2 = end; } else { s1 = ""; l1 = 0; |
8c4af38e9 gcc-4.6: printk: ... |
1706 1707 |
s2 = log_buf + end - chars; l2 = chars; |
456b565cc core: Add kernel ... |
1708 |
} |
fb842b00c printk: use RCU t... |
1709 1710 |
rcu_read_lock(); list_for_each_entry_rcu(dumper, &dump_list, list) |
456b565cc core: Add kernel ... |
1711 |
dumper->dump(dumper, reason, s1, l1, s2, l2); |
fb842b00c printk: use RCU t... |
1712 |
rcu_read_unlock(); |
456b565cc core: Add kernel ... |
1713 |
} |
7ef3d2fd1 printk_ratelimit(... |
1714 |
#endif |