Blame view
kernel/printk.c
42.6 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 99 |
*/ static DEFINE_SPINLOCK(logbuf_lock); |
eed4a2aba printk.c: use uns... |
100 |
#define LOG_BUF_MASK (log_buf_len-1) |
1da177e4c Linux-2.6.12-rc2 |
101 102 103 104 105 106 |
#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... |
107 108 109 |
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 |
110 111 |
/* |
fe3d8ad31 console: prevent ... |
112 113 114 115 116 |
* 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 |
117 118 119 120 121 122 123 |
* 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... |
124 125 126 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE char *brl_options; /* Options for braille driver */ #endif |
1da177e4c Linux-2.6.12-rc2 |
127 128 129 130 131 132 133 |
}; #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... |
134 135 |
int console_set_on_cmdline; EXPORT_SYMBOL(console_set_on_cmdline); |
1da177e4c Linux-2.6.12-rc2 |
136 137 138 |
/* Flag: console code may call schedule() */ static int console_may_schedule; |
d59745ce3 [PATCH] clean up ... |
139 140 141 142 143 |
#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... |
144 |
static unsigned logged_chars; /* Number of chars produced since last read+clear operation */ |
cea83886d printk: avoid war... |
145 |
static int saved_console_loglevel = -1; |
d59745ce3 [PATCH] clean up ... |
146 |
|
04d491ab2 kexec: add dmesg ... |
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
#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 ... |
164 165 166 167 |
/* 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 |
168 169 |
static int __init log_buf_len_setup(char *str) { |
eed4a2aba printk.c: use uns... |
170 |
unsigned size = memparse(str, &str); |
1da177e4c Linux-2.6.12-rc2 |
171 172 173 |
if (size) size = roundup_pow_of_two(size); |
162a7e750 printk: allocate ... |
174 175 176 177 |
if (size > log_buf_len) new_log_buf_len = size; return 0; |
1da177e4c Linux-2.6.12-rc2 |
178 |
} |
162a7e750 printk: allocate ... |
179 180 181 182 183 184 185 186 187 188 189 |
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 |
190 |
|
162a7e750 printk: allocate ... |
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
if (early) { unsigned long mem; mem = memblock_alloc(new_log_buf_len, PAGE_SIZE); if (mem == MEMBLOCK_ERROR) 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; } spin_lock_irqsave(&logbuf_lock, flags); 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; spin_unlock_irqrestore(&logbuf_lock, flags); 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 313 314 315 316 317 318 319 320 321 |
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)) { WARN_ONCE(1, "Attempt to access syslog with CAP_SYS_ADMIN " "but no CAP_SYSLOG (deprecated). "); return 0; } return -EPERM; } return 0; } |
002345925 syslog: distingui... |
322 |
int do_syslog(int type, char __user *buf, int len, bool from_file) |
1da177e4c Linux-2.6.12-rc2 |
323 |
{ |
eed4a2aba printk.c: use uns... |
324 |
unsigned i, j, limit, count; |
1da177e4c Linux-2.6.12-rc2 |
325 326 |
int do_clear = 0; char c; |
ee24aebff cap_syslog: accep... |
327 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
328 |
|
ee24aebff cap_syslog: accep... |
329 330 331 |
error = check_syslog_permissions(type, from_file); if (error) goto out; |
12b3052c3 capabilities/sysl... |
332 333 |
error = security_syslog(type); |
1da177e4c Linux-2.6.12-rc2 |
334 335 336 337 |
if (error) return error; switch (type) { |
d78ca3cd7 syslog: use defin... |
338 |
case SYSLOG_ACTION_CLOSE: /* Close log */ |
1da177e4c Linux-2.6.12-rc2 |
339 |
break; |
d78ca3cd7 syslog: use defin... |
340 |
case SYSLOG_ACTION_OPEN: /* Open log */ |
1da177e4c Linux-2.6.12-rc2 |
341 |
break; |
d78ca3cd7 syslog: use defin... |
342 |
case SYSLOG_ACTION_READ: /* Read from log */ |
1da177e4c Linux-2.6.12-rc2 |
343 344 345 346 347 348 349 350 351 352 |
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... |
353 354 |
error = wait_event_interruptible(log_wait, (log_start - log_end)); |
1da177e4c Linux-2.6.12-rc2 |
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
if (error) goto out; i = 0; spin_lock_irq(&logbuf_lock); while (!error && (log_start != log_end) && i < len) { c = LOG_BUF(log_start); log_start++; spin_unlock_irq(&logbuf_lock); error = __put_user(c,buf); buf++; i++; cond_resched(); spin_lock_irq(&logbuf_lock); } spin_unlock_irq(&logbuf_lock); if (!error) error = i; break; |
d78ca3cd7 syslog: use defin... |
373 374 |
/* Read/clear last kernel messages */ case SYSLOG_ACTION_READ_CLEAR: |
40dc56512 [PATCH] cleanup f... |
375 |
do_clear = 1; |
1da177e4c Linux-2.6.12-rc2 |
376 |
/* FALL THRU */ |
d78ca3cd7 syslog: use defin... |
377 378 |
/* Read last kernel messages */ case SYSLOG_ACTION_READ_ALL: |
1da177e4c Linux-2.6.12-rc2 |
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 |
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; spin_lock_irq(&logbuf_lock); 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... |
400 |
* printk() could overwrite the messages |
1da177e4c Linux-2.6.12-rc2 |
401 402 403 |
* we try to copy to user space. Therefore * the messages are copied in reverse. <manfreds> */ |
40dc56512 [PATCH] cleanup f... |
404 |
for (i = 0; i < count && !error; i++) { |
1da177e4c Linux-2.6.12-rc2 |
405 406 407 408 409 410 411 412 413 414 415 416 417 |
j = limit-1-i; if (j + log_buf_len < log_end) break; c = LOG_BUF(j); spin_unlock_irq(&logbuf_lock); error = __put_user(c,&buf[count-1-i]); cond_resched(); spin_lock_irq(&logbuf_lock); } spin_unlock_irq(&logbuf_lock); if (error) break; error = i; |
40dc56512 [PATCH] cleanup f... |
418 |
if (i != count) { |
1da177e4c Linux-2.6.12-rc2 |
419 420 |
int offset = count-error; /* buffer overflow during copy, correct user buffer. */ |
40dc56512 [PATCH] cleanup f... |
421 |
for (i = 0; i < error; i++) { |
1da177e4c Linux-2.6.12-rc2 |
422 423 424 425 426 427 428 429 430 |
if (__get_user(c,&buf[i+offset]) || __put_user(c,&buf[i])) { error = -EFAULT; break; } cond_resched(); } } break; |
d78ca3cd7 syslog: use defin... |
431 432 |
/* Clear ring buffer */ case SYSLOG_ACTION_CLEAR: |
1da177e4c Linux-2.6.12-rc2 |
433 434 |
logged_chars = 0; break; |
d78ca3cd7 syslog: use defin... |
435 436 |
/* Disable logging to console */ case SYSLOG_ACTION_CONSOLE_OFF: |
1aaad49e8 printk: Restore p... |
437 438 |
if (saved_console_loglevel == -1) saved_console_loglevel = console_loglevel; |
1da177e4c Linux-2.6.12-rc2 |
439 440 |
console_loglevel = minimum_console_loglevel; break; |
d78ca3cd7 syslog: use defin... |
441 442 |
/* Enable logging to console */ case SYSLOG_ACTION_CONSOLE_ON: |
1aaad49e8 printk: Restore p... |
443 444 445 446 |
if (saved_console_loglevel != -1) { console_loglevel = saved_console_loglevel; saved_console_loglevel = -1; } |
1da177e4c Linux-2.6.12-rc2 |
447 |
break; |
d78ca3cd7 syslog: use defin... |
448 449 |
/* Set level of messages printed to console */ case SYSLOG_ACTION_CONSOLE_LEVEL: |
1da177e4c Linux-2.6.12-rc2 |
450 451 452 453 454 455 |
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... |
456 457 |
/* Implicitly re-enable logging to console */ saved_console_loglevel = -1; |
1da177e4c Linux-2.6.12-rc2 |
458 459 |
error = 0; break; |
d78ca3cd7 syslog: use defin... |
460 461 |
/* Number of chars in the log buffer */ case SYSLOG_ACTION_SIZE_UNREAD: |
1da177e4c Linux-2.6.12-rc2 |
462 463 |
error = log_end - log_start; break; |
d78ca3cd7 syslog: use defin... |
464 465 |
/* Size of the log buffer */ case SYSLOG_ACTION_SIZE_BUFFER: |
1da177e4c Linux-2.6.12-rc2 |
466 467 468 469 470 471 472 473 474 |
error = log_buf_len; break; default: error = -EINVAL; break; } out: return error; } |
1e7bfb213 [CVE-2009-0029] S... |
475 |
SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) |
1da177e4c Linux-2.6.12-rc2 |
476 |
{ |
002345925 syslog: distingui... |
477 |
return do_syslog(type, buf, len, SYSLOG_FROM_CALL); |
1da177e4c Linux-2.6.12-rc2 |
478 |
} |
67fc4e0cb kdb: core for kgd... |
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 |
#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 |
494 495 496 |
/* * Call the console drivers on a range of log_buf */ |
eed4a2aba printk.c: use uns... |
497 |
static void __call_console_drivers(unsigned start, unsigned end) |
1da177e4c Linux-2.6.12-rc2 |
498 499 |
{ struct console *con; |
4d0916119 printk: Enable th... |
500 |
for_each_console(con) { |
fe3d8ad31 console: prevent ... |
501 502 |
if (exclusive_console && con != exclusive_console) continue; |
76a8ad293 [PATCH] Make prin... |
503 504 505 |
if ((con->flags & CON_ENABLED) && con->write && (cpu_online(smp_processor_id()) || (con->flags & CON_ANYTIME))) |
1da177e4c Linux-2.6.12-rc2 |
506 507 508 |
con->write(con, &LOG_BUF(start), end - start); } } |
792908225 [PATCH] add ignor... |
509 |
static int __read_mostly ignore_loglevel; |
99eea6a10 [PATCH] make kern... |
510 |
static int __init ignore_loglevel_setup(char *str) |
792908225 [PATCH] add ignor... |
511 512 513 514 |
{ ignore_loglevel = 1; printk(KERN_INFO "debug: ignoring loglevel setting. "); |
c4772d993 debug: turn ignor... |
515 |
return 0; |
792908225 [PATCH] add ignor... |
516 |
} |
c4772d993 debug: turn ignor... |
517 |
early_param("ignore_loglevel", ignore_loglevel_setup); |
792908225 [PATCH] add ignor... |
518 |
|
1da177e4c Linux-2.6.12-rc2 |
519 520 521 |
/* * Write out chars from start to end - 1 inclusive */ |
eed4a2aba printk.c: use uns... |
522 523 |
static void _call_console_drivers(unsigned start, unsigned end, int msg_log_level) |
1da177e4c Linux-2.6.12-rc2 |
524 |
{ |
792908225 [PATCH] add ignor... |
525 |
if ((msg_log_level < console_loglevel || ignore_loglevel) && |
1da177e4c Linux-2.6.12-rc2 |
526 527 528 529 530 531 532 533 534 535 536 537 538 |
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... |
539 540 541 542 543 544 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 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 |
* 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; if (p[1] < '0' && p[1] > '9') return 0; 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 |
604 605 |
* Call the console drivers, asking them to write out * log_buf[start] to log_buf[end - 1]. |
ac751efa6 console: rename a... |
606 |
* The console_lock must be held. |
1da177e4c Linux-2.6.12-rc2 |
607 |
*/ |
eed4a2aba printk.c: use uns... |
608 |
static void call_console_drivers(unsigned start, unsigned end) |
1da177e4c Linux-2.6.12-rc2 |
609 |
{ |
eed4a2aba printk.c: use uns... |
610 |
unsigned cur_index, start_print; |
1da177e4c Linux-2.6.12-rc2 |
611 |
static int msg_level = -1; |
eed4a2aba printk.c: use uns... |
612 |
BUG_ON(((int)(start - end)) > 0); |
1da177e4c Linux-2.6.12-rc2 |
613 614 615 616 |
cur_index = start; start_print = start; while (cur_index != end) { |
9d90c8d9c printk: do not ma... |
617 618 619 |
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 |
620 621 622 623 |
start_print = cur_index; } while (cur_index != end) { char c = LOG_BUF(cur_index); |
1da177e4c Linux-2.6.12-rc2 |
624 |
|
40dc56512 [PATCH] cleanup f... |
625 |
cur_index++; |
1da177e4c Linux-2.6.12-rc2 |
626 627 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 |
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... |
669 |
!time_after(jiffies, oops_timestamp + 30 * HZ)) |
1da177e4c Linux-2.6.12-rc2 |
670 671 672 673 674 675 676 |
return; oops_timestamp = jiffies; /* If a crash is occurring, make sure we can't deadlock */ spin_lock_init(&logbuf_lock); /* And make sure that we print immediately */ |
5b8c4f23c printk: Make cons... |
677 |
sema_init(&console_sem, 1); |
1da177e4c Linux-2.6.12-rc2 |
678 679 680 681 682 683 684 |
} #if defined(CONFIG_PRINTK_TIME) static int printk_time = 1; #else static int printk_time = 0; #endif |
e84845c4b add printk.time o... |
685 |
module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); |
1da177e4c Linux-2.6.12-rc2 |
686 |
|
76a8ad293 [PATCH] Make prin... |
687 688 689 690 |
/* 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... |
691 |
for_each_console(con) |
76a8ad293 [PATCH] Make prin... |
692 693 694 695 696 |
if (con->flags & CON_ANYTIME) return 1; return 0; } |
ddad86c2d [PATCH] DocBook: ... |
697 698 699 700 |
/** * printk - print a kernel message * @fmt: format string * |
72fd4a35a [PATCH] Numerous ... |
701 |
* This is printk(). It can be called from any context. We want it to work. |
40dc56512 [PATCH] cleanup f... |
702 |
* |
ac751efa6 console: rename a... |
703 |
* We try to grab the console_lock. If we succeed, it's easy - we log the output and |
1da177e4c Linux-2.6.12-rc2 |
704 705 |
* 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... |
706 707 |
* notice the new output in console_unlock(); and will send it to the * consoles before releasing the lock. |
1da177e4c Linux-2.6.12-rc2 |
708 709 710 711 |
* * 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: ... |
712 713 714 |
* * See also: * printf(3) |
20036fdca Add kerneldoc doc... |
715 716 |
* * See the vsnprintf() documentation for format string extensions over C99. |
1da177e4c Linux-2.6.12-rc2 |
717 |
*/ |
d59745ce3 [PATCH] clean up ... |
718 |
|
1da177e4c Linux-2.6.12-rc2 |
719 720 721 722 |
asmlinkage int printk(const char *fmt, ...) { va_list args; int r; |
d37d39ae3 printk,kdb: captu... |
723 724 725 726 727 728 729 730 |
#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 |
731 732 733 734 735 736 |
va_start(args, fmt); r = vprintk(fmt, args); va_end(args); return r; } |
fe21773d6 [PATCH] Provide b... |
737 738 |
/* cpu currently holding logbuf_lock */ static volatile unsigned int printk_cpu = UINT_MAX; |
266c2e0ab Make printk() con... |
739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 |
/* * 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... |
755 |
* console_lock held, and 'console_locked' set) if it |
266c2e0ab Make printk() con... |
756 757 758 759 760 761 |
* 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... |
762 |
static int console_trylock_for_printk(unsigned int cpu) |
8155c02a4 printk: add lock ... |
763 |
__releases(&logbuf_lock) |
266c2e0ab Make printk() con... |
764 765 |
{ int retval = 0; |
ac751efa6 console: rename a... |
766 |
if (console_trylock()) { |
093a07e2f Fix locking bug i... |
767 768 769 770 771 772 773 774 775 776 777 778 779 780 |
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; up(&console_sem); retval = 0; } } |
266c2e0ab Make printk() con... |
781 782 783 784 |
printk_cpu = UINT_MAX; spin_unlock(&logbuf_lock); return retval; } |
3b8945e8d printk: clean up ... |
785 786 787 788 |
static const char recursion_bug_msg [] = KERN_CRIT "BUG: recent printk recursion! "; static int recursion_bug; |
edb123e16 trivial: printk: ... |
789 |
static int new_text_line = 1; |
3b8945e8d printk: clean up ... |
790 |
static char printk_buf[1024]; |
32a760066 printk: make prin... |
791 |
|
af91322ef printk: add print... |
792 793 794 795 796 797 798 799 800 801 802 803 804 |
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 |
805 806 |
asmlinkage int vprintk(const char *fmt, va_list args) { |
32a760066 printk: make prin... |
807 |
int printed_len = 0; |
091593080 printk: remember ... |
808 |
int current_log_level = default_message_loglevel; |
ac60ad741 printk: refactor ... |
809 |
unsigned long flags; |
32a760066 printk: make prin... |
810 |
int this_cpu; |
1da177e4c Linux-2.6.12-rc2 |
811 |
char *p; |
9d90c8d9c printk: do not ma... |
812 813 |
size_t plen; char special; |
1da177e4c Linux-2.6.12-rc2 |
814 |
|
bfe8df3d3 slow down printk ... |
815 |
boot_delay_msec(); |
af91322ef printk: add print... |
816 |
printk_delay(); |
bfe8df3d3 slow down printk ... |
817 |
|
fe21773d6 [PATCH] Provide b... |
818 |
preempt_disable(); |
1da177e4c Linux-2.6.12-rc2 |
819 |
/* This stops the holder of console_sem just where we want him */ |
1efc5da3c [PATCH] order of ... |
820 |
raw_local_irq_save(flags); |
32a760066 printk: make prin... |
821 822 823 824 825 826 827 828 829 830 831 832 833 834 |
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: */ if (!oops_in_progress) { |
3b8945e8d printk: clean up ... |
835 |
recursion_bug = 1; |
32a760066 printk: make prin... |
836 837 838 839 |
goto out_restore_irqs; } zap_locks(); } |
a0f1ccfd8 [PATCH] lockdep: ... |
840 841 |
lockdep_off(); spin_lock(&logbuf_lock); |
32a760066 printk: make prin... |
842 |
printk_cpu = this_cpu; |
1da177e4c Linux-2.6.12-rc2 |
843 |
|
3b8945e8d printk: clean up ... |
844 845 846 |
if (recursion_bug) { recursion_bug = 0; strcpy(printk_buf, recursion_bug_msg); |
26cc271db printk: fix disca... |
847 |
printed_len = strlen(recursion_bug_msg); |
32a760066 printk: make prin... |
848 |
} |
1da177e4c Linux-2.6.12-rc2 |
849 |
/* Emit the output into the temporary buffer */ |
32a760066 printk: make prin... |
850 |
printed_len += vscnprintf(printk_buf + printed_len, |
cf3680b90 printk: fix possi... |
851 |
sizeof(printk_buf) - printed_len, fmt, args); |
1da177e4c Linux-2.6.12-rc2 |
852 |
|
5fd29d6cc printk: clean up ... |
853 |
p = printk_buf; |
9d90c8d9c printk: do not ma... |
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 |
/* 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 ... |
870 871 872 |
} } } |
1da177e4c Linux-2.6.12-rc2 |
873 |
/* |
9d90c8d9c printk: do not ma... |
874 875 |
* 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 |
876 |
*/ |
9d90c8d9c printk: do not ma... |
877 |
for (; *p; p++) { |
ac60ad741 printk: refactor ... |
878 |
if (new_text_line) { |
ac60ad741 printk: refactor ... |
879 |
new_text_line = 0; |
9d90c8d9c printk: do not ma... |
880 881 882 883 884 885 886 887 888 889 890 891 892 893 |
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 |
894 |
if (printk_time) { |
9d90c8d9c printk: do not ma... |
895 |
/* Add the current time stamp */ |
1da177e4c Linux-2.6.12-rc2 |
896 897 898 899 |
char tbuf[50], *tp; unsigned tlen; unsigned long long t; unsigned long nanosec_rem; |
326e96b92 printk: revert kt... |
900 |
t = cpu_clock(printk_cpu); |
1da177e4c Linux-2.6.12-rc2 |
901 |
nanosec_rem = do_div(t, 1000000000); |
ac60ad741 printk: refactor ... |
902 903 904 |
tlen = sprintf(tbuf, "[%5lu.%06lu] ", (unsigned long) t, nanosec_rem / 1000); |
1da177e4c Linux-2.6.12-rc2 |
905 906 907 |
for (tp = tbuf; tp < tbuf + tlen; tp++) emit_log_char(*tp); |
025510cd2 [PATCH] printk re... |
908 |
printed_len += tlen; |
1da177e4c Linux-2.6.12-rc2 |
909 |
} |
ac60ad741 printk: refactor ... |
910 |
|
1da177e4c Linux-2.6.12-rc2 |
911 912 913 |
if (!*p) break; } |
ac60ad741 printk: refactor ... |
914 |
|
1da177e4c Linux-2.6.12-rc2 |
915 916 917 |
emit_log_char(*p); if (*p == ' ') |
ac60ad741 printk: refactor ... |
918 |
new_text_line = 1; |
1da177e4c Linux-2.6.12-rc2 |
919 |
} |
266c2e0ab Make printk() con... |
920 921 922 923 924 925 |
/* * 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... |
926 |
* The console_trylock_for_printk() function |
266c2e0ab Make printk() con... |
927 928 929 |
* will release 'logbuf_lock' regardless of whether it * actually gets the semaphore or not. */ |
ac751efa6 console: rename a... |
930 931 |
if (console_trylock_for_printk(this_cpu)) console_unlock(); |
76a8ad293 [PATCH] Make prin... |
932 |
|
266c2e0ab Make printk() con... |
933 |
lockdep_on(); |
32a760066 printk: make prin... |
934 |
out_restore_irqs: |
266c2e0ab Make printk() con... |
935 |
raw_local_irq_restore(flags); |
76a8ad293 [PATCH] Make prin... |
936 |
|
fe21773d6 [PATCH] Provide b... |
937 |
preempt_enable(); |
1da177e4c Linux-2.6.12-rc2 |
938 939 940 941 |
return printed_len; } EXPORT_SYMBOL(printk); EXPORT_SYMBOL(vprintk); |
d59745ce3 [PATCH] clean up ... |
942 |
#else |
eed4a2aba printk.c: use uns... |
943 |
static void call_console_drivers(unsigned start, unsigned end) |
40dc56512 [PATCH] cleanup f... |
944 945 |
{ } |
d59745ce3 [PATCH] clean up ... |
946 947 |
#endif |
f7511d5f6 Basic braille scr... |
948 949 950 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 |
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... |
978 979 980 981 982 |
/* * Set up a list of consoles. Called from init/main.c */ static int __init console_setup(char *str) { |
eaa944afb console: more buf... |
983 |
char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */ |
f7511d5f6 Basic braille scr... |
984 |
char *s, *options, *brl_options = NULL; |
2ea1c5392 [PATCH] console_s... |
985 |
int idx; |
f7511d5f6 Basic braille scr... |
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 |
#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... |
1001 1002 1003 1004 |
/* * Decode str into name, index, options. */ if (str[0] >= '0' && str[0] <= '9') { |
eaa944afb console: more buf... |
1005 1006 |
strcpy(buf, "ttyS"); strncpy(buf + 4, str, sizeof(buf) - 5); |
2ea1c5392 [PATCH] console_s... |
1007 |
} else { |
eaa944afb console: more buf... |
1008 |
strncpy(buf, str, sizeof(buf) - 1); |
2ea1c5392 [PATCH] console_s... |
1009 |
} |
eaa944afb console: more buf... |
1010 |
buf[sizeof(buf) - 1] = 0; |
2ea1c5392 [PATCH] console_s... |
1011 1012 1013 1014 |
if ((options = strchr(str, ',')) != NULL) *(options++) = 0; #ifdef __sparc__ if (!strcmp(str, "ttya")) |
eaa944afb console: more buf... |
1015 |
strcpy(buf, "ttyS0"); |
2ea1c5392 [PATCH] console_s... |
1016 |
if (!strcmp(str, "ttyb")) |
eaa944afb console: more buf... |
1017 |
strcpy(buf, "ttyS1"); |
2ea1c5392 [PATCH] console_s... |
1018 |
#endif |
eaa944afb console: more buf... |
1019 |
for (s = buf; *s; s++) |
2ea1c5392 [PATCH] console_s... |
1020 1021 1022 1023 |
if ((*s >= '0' && *s <= '9') || *s == ',') break; idx = simple_strtoul(s, NULL, 10); *s = 0; |
f7511d5f6 Basic braille scr... |
1024 |
__add_preferred_console(buf, idx, options, brl_options); |
9e124fe16 xen: Enable conso... |
1025 |
console_set_on_cmdline = 1; |
2ea1c5392 [PATCH] console_s... |
1026 1027 1028 |
return 1; } __setup("console=", console_setup); |
1da177e4c Linux-2.6.12-rc2 |
1029 |
/** |
3c0547ba8 [PATCH] add_prefe... |
1030 |
* add_preferred_console - add a device to the list of preferred consoles. |
ddad86c2d [PATCH] DocBook: ... |
1031 1032 1033 |
* @name: device name * @idx: device index * @options: options for this console |
3c0547ba8 [PATCH] add_prefe... |
1034 1035 1036 1037 1038 1039 1040 1041 |
* * 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... |
1042 |
int add_preferred_console(char *name, int idx, char *options) |
3c0547ba8 [PATCH] add_prefe... |
1043 |
{ |
f7511d5f6 Basic braille scr... |
1044 |
return __add_preferred_console(name, idx, options, NULL); |
3c0547ba8 [PATCH] add_prefe... |
1045 |
} |
b6b1d8778 serial: fix 8250 ... |
1046 |
int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options) |
18a8bd949 serial: convert e... |
1047 1048 1049 1050 1051 1052 1053 1054 |
{ 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... |
1055 |
strlcpy(c->name, name_new, sizeof(c->name)); |
18a8bd949 serial: convert e... |
1056 1057 1058 1059 1060 1061 1062 1063 |
c->name[sizeof(c->name) - 1] = 0; c->options = options; c->index = idx_new; return i; } /* not found */ return -1; } |
8f4ce8c32 serial: turn seri... |
1064 1065 1066 1067 1068 1069 1070 1071 1072 |
int console_suspend_enabled = 1; 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); |
3c0547ba8 [PATCH] add_prefe... |
1073 |
/** |
557240b48 Add support for s... |
1074 1075 1076 1077 1078 1079 |
* suspend_console - suspend the console subsystem * * This disables printk() while we go into suspend states */ void suspend_console(void) { |
8f4ce8c32 serial: turn seri... |
1080 1081 |
if (!console_suspend_enabled) return; |
0d63081d4 swsusp: provide u... |
1082 1083 |
printk("Suspending console(s) (use no_console_suspend to debug) "); |
ac751efa6 console: rename a... |
1084 |
console_lock(); |
557240b48 Add support for s... |
1085 |
console_suspended = 1; |
403f30757 PM: Fix suspend_c... |
1086 |
up(&console_sem); |
557240b48 Add support for s... |
1087 1088 1089 1090 |
} void resume_console(void) { |
8f4ce8c32 serial: turn seri... |
1091 1092 |
if (!console_suspend_enabled) return; |
403f30757 PM: Fix suspend_c... |
1093 |
down(&console_sem); |
557240b48 Add support for s... |
1094 |
console_suspended = 0; |
ac751efa6 console: rename a... |
1095 |
console_unlock(); |
557240b48 Add support for s... |
1096 1097 1098 |
} /** |
034260d67 printk: fix delay... |
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 |
* 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... |
1118 1119 |
console_lock(); console_unlock(); |
034260d67 printk: fix delay... |
1120 1121 1122 1123 1124 |
} return NOTIFY_OK; } /** |
ac751efa6 console: rename a... |
1125 |
* console_lock - lock the console system for exclusive use. |
1da177e4c Linux-2.6.12-rc2 |
1126 |
* |
ac751efa6 console: rename a... |
1127 |
* Acquires a lock which guarantees that the caller has |
1da177e4c Linux-2.6.12-rc2 |
1128 1129 1130 1131 |
* exclusive access to the console system and the console_drivers list. * * Can sleep, returns nothing. */ |
ac751efa6 console: rename a... |
1132 |
void console_lock(void) |
1da177e4c Linux-2.6.12-rc2 |
1133 |
{ |
8abd8e298 BUG_ON() Conversi... |
1134 |
BUG_ON(in_interrupt()); |
1da177e4c Linux-2.6.12-rc2 |
1135 |
down(&console_sem); |
403f30757 PM: Fix suspend_c... |
1136 1137 |
if (console_suspended) return; |
1da177e4c Linux-2.6.12-rc2 |
1138 1139 1140 |
console_locked = 1; console_may_schedule = 1; } |
ac751efa6 console: rename a... |
1141 |
EXPORT_SYMBOL(console_lock); |
1da177e4c Linux-2.6.12-rc2 |
1142 |
|
ac751efa6 console: rename a... |
1143 1144 1145 1146 1147 1148 1149 1150 1151 |
/** * 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 |
1152 1153 |
{ if (down_trylock(&console_sem)) |
ac751efa6 console: rename a... |
1154 |
return 0; |
403f30757 PM: Fix suspend_c... |
1155 1156 |
if (console_suspended) { up(&console_sem); |
ac751efa6 console: rename a... |
1157 |
return 0; |
403f30757 PM: Fix suspend_c... |
1158 |
} |
1da177e4c Linux-2.6.12-rc2 |
1159 1160 |
console_locked = 1; console_may_schedule = 0; |
ac751efa6 console: rename a... |
1161 |
return 1; |
1da177e4c Linux-2.6.12-rc2 |
1162 |
} |
ac751efa6 console: rename a... |
1163 |
EXPORT_SYMBOL(console_trylock); |
1da177e4c Linux-2.6.12-rc2 |
1164 1165 1166 1167 1168 |
int is_console_locked(void) { return console_locked; } |
1da177e4c Linux-2.6.12-rc2 |
1169 |
|
b845b517b printk: robustify... |
1170 1171 1172 |
static DEFINE_PER_CPU(int, printk_pending); void printk_tick(void) |
e3e8a75d2 [PATCH] Extract a... |
1173 |
{ |
40dc11ffb printk: Use this_... |
1174 1175 |
if (__this_cpu_read(printk_pending)) { __this_cpu_write(printk_pending, 0); |
e3e8a75d2 [PATCH] Extract a... |
1176 |
wake_up_interruptible(&log_wait); |
b845b517b printk: robustify... |
1177 1178 1179 1180 1181 |
} } int printk_needs_cpu(int cpu) { |
40dc11ffb printk: Use this_... |
1182 |
if (cpu_is_offline(cpu)) |
61ab25447 nohz: Fix printk_... |
1183 |
printk_tick(); |
40dc11ffb printk: Use this_... |
1184 |
return __this_cpu_read(printk_pending); |
b845b517b printk: robustify... |
1185 1186 1187 1188 1189 |
} void wake_up_klogd(void) { if (waitqueue_active(&log_wait)) |
49f413834 printk: Fix wake_... |
1190 |
this_cpu_write(printk_pending, 1); |
e3e8a75d2 [PATCH] Extract a... |
1191 |
} |
1da177e4c Linux-2.6.12-rc2 |
1192 |
/** |
ac751efa6 console: rename a... |
1193 |
* console_unlock - unlock the console system |
1da177e4c Linux-2.6.12-rc2 |
1194 |
* |
ac751efa6 console: rename a... |
1195 |
* Releases the console_lock which the caller holds on the console system |
1da177e4c Linux-2.6.12-rc2 |
1196 1197 |
* and the console driver list. * |
ac751efa6 console: rename a... |
1198 1199 1200 |
* 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 |
1201 1202 1203 |
* * If there is output waiting for klogd, we wake it up. * |
ac751efa6 console: rename a... |
1204 |
* console_unlock(); may be called from any context. |
1da177e4c Linux-2.6.12-rc2 |
1205 |
*/ |
ac751efa6 console: rename a... |
1206 |
void console_unlock(void) |
1da177e4c Linux-2.6.12-rc2 |
1207 1208 |
{ unsigned long flags; |
eed4a2aba printk.c: use uns... |
1209 1210 |
unsigned _con_start, _log_end; unsigned wake_klogd = 0; |
1da177e4c Linux-2.6.12-rc2 |
1211 |
|
557240b48 Add support for s... |
1212 |
if (console_suspended) { |
403f30757 PM: Fix suspend_c... |
1213 |
up(&console_sem); |
557240b48 Add support for s... |
1214 1215 |
return; } |
78944e549 [PATCH] vt: print... |
1216 1217 |
console_may_schedule = 0; |
1da177e4c Linux-2.6.12-rc2 |
1218 1219 1220 1221 1222 1223 1224 1225 1226 |
for ( ; ; ) { spin_lock_irqsave(&logbuf_lock, flags); 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 */ spin_unlock(&logbuf_lock); |
81d68a96a ftrace: trace irq... |
1227 |
stop_critical_timings(); /* don't trace print latency */ |
1da177e4c Linux-2.6.12-rc2 |
1228 |
call_console_drivers(_con_start, _log_end); |
81d68a96a ftrace: trace irq... |
1229 |
start_critical_timings(); |
1da177e4c Linux-2.6.12-rc2 |
1230 1231 1232 |
local_irq_restore(flags); } console_locked = 0; |
fe3d8ad31 console: prevent ... |
1233 1234 1235 1236 |
/* Release the exclusive_console once it is used */ if (unlikely(exclusive_console)) exclusive_console = NULL; |
1da177e4c Linux-2.6.12-rc2 |
1237 1238 |
up(&console_sem); spin_unlock_irqrestore(&logbuf_lock, flags); |
e3e8a75d2 [PATCH] Extract a... |
1239 1240 |
if (wake_klogd) wake_up_klogd(); |
1da177e4c Linux-2.6.12-rc2 |
1241 |
} |
ac751efa6 console: rename a... |
1242 |
EXPORT_SYMBOL(console_unlock); |
1da177e4c Linux-2.6.12-rc2 |
1243 |
|
ddad86c2d [PATCH] DocBook: ... |
1244 1245 |
/** * console_conditional_schedule - yield the CPU if required |
1da177e4c Linux-2.6.12-rc2 |
1246 1247 1248 1249 1250 |
* * 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... |
1251 |
* Must be called within console_lock();. |
1da177e4c Linux-2.6.12-rc2 |
1252 1253 1254 1255 1256 1257 1258 |
*/ void __sched console_conditional_schedule(void) { if (console_may_schedule) cond_resched(); } EXPORT_SYMBOL(console_conditional_schedule); |
1da177e4c Linux-2.6.12-rc2 |
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 |
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... |
1271 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1272 1273 1274 |
console_locked = 1; console_may_schedule = 0; |
4d0916119 printk: Enable th... |
1275 |
for_each_console(c) |
1da177e4c Linux-2.6.12-rc2 |
1276 1277 |
if ((c->flags & CON_ENABLED) && c->unblank) c->unblank(); |
ac751efa6 console: rename a... |
1278 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1279 |
} |
1da177e4c Linux-2.6.12-rc2 |
1280 1281 1282 1283 1284 1285 1286 1287 |
/* * 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... |
1288 |
console_lock(); |
4d0916119 printk: Enable th... |
1289 |
for_each_console(c) { |
1da177e4c Linux-2.6.12-rc2 |
1290 1291 1292 1293 1294 1295 |
if (!c->device) continue; driver = c->device(c, index); if (driver) break; } |
ac751efa6 console: rename a... |
1296 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 |
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... |
1307 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1308 |
console->flags &= ~CON_ENABLED; |
ac751efa6 console: rename a... |
1309 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1310 1311 1312 1313 1314 |
} EXPORT_SYMBOL(console_stop); void console_start(struct console *console) { |
ac751efa6 console: rename a... |
1315 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1316 |
console->flags |= CON_ENABLED; |
ac751efa6 console: rename a... |
1317 |
console_unlock(); |
1da177e4c Linux-2.6.12-rc2 |
1318 1319 |
} EXPORT_SYMBOL(console_start); |
7bf693951 console: allow to... |
1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 |
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 |
1332 1333 1334 1335 1336 |
/* * 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... |
1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 |
* * 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 |
1350 |
*/ |
4d0916119 printk: Enable th... |
1351 |
void register_console(struct console *newcon) |
1da177e4c Linux-2.6.12-rc2 |
1352 |
{ |
40dc56512 [PATCH] cleanup f... |
1353 |
int i; |
1da177e4c Linux-2.6.12-rc2 |
1354 |
unsigned long flags; |
4d0916119 printk: Enable th... |
1355 |
struct console *bcon = NULL; |
1da177e4c Linux-2.6.12-rc2 |
1356 |
|
4d0916119 printk: Enable th... |
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 |
/* * 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... |
1371 |
} |
4d0916119 printk: Enable th... |
1372 1373 1374 1375 |
if (console_drivers && console_drivers->flags & CON_BOOT) bcon = console_drivers; if (preferred_console < 0 || bcon || !console_drivers) |
1da177e4c Linux-2.6.12-rc2 |
1376 |
preferred_console = selected_console; |
4d0916119 printk: Enable th... |
1377 1378 |
if (newcon->early_setup) newcon->early_setup(); |
18a8bd949 serial: convert e... |
1379 |
|
1da177e4c Linux-2.6.12-rc2 |
1380 1381 1382 1383 1384 1385 |
/* * 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... |
1386 1387 1388 1389 1390 1391 1392 |
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... |
1393 1394 |
preferred_console = 0; } |
1da177e4c Linux-2.6.12-rc2 |
1395 1396 1397 1398 1399 1400 1401 |
} } /* * See if this console matches one we selected on * the command line. */ |
40dc56512 [PATCH] cleanup f... |
1402 1403 |
for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) { |
4d0916119 printk: Enable th... |
1404 |
if (strcmp(console_cmdline[i].name, newcon->name) != 0) |
1da177e4c Linux-2.6.12-rc2 |
1405 |
continue; |
4d0916119 printk: Enable th... |
1406 1407 |
if (newcon->index >= 0 && newcon->index != console_cmdline[i].index) |
1da177e4c Linux-2.6.12-rc2 |
1408 |
continue; |
4d0916119 printk: Enable th... |
1409 1410 |
if (newcon->index < 0) newcon->index = console_cmdline[i].index; |
f7511d5f6 Basic braille scr... |
1411 1412 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE if (console_cmdline[i].brl_options) { |
4d0916119 printk: Enable th... |
1413 1414 |
newcon->flags |= CON_BRL; braille_register_console(newcon, |
f7511d5f6 Basic braille scr... |
1415 1416 1417 1418 1419 1420 |
console_cmdline[i].index, console_cmdline[i].options, console_cmdline[i].brl_options); return; } #endif |
4d0916119 printk: Enable th... |
1421 1422 |
if (newcon->setup && newcon->setup(newcon, console_cmdline[i].options) != 0) |
1da177e4c Linux-2.6.12-rc2 |
1423 |
break; |
4d0916119 printk: Enable th... |
1424 1425 |
newcon->flags |= CON_ENABLED; newcon->index = console_cmdline[i].index; |
ab4af03a4 [PATCH] CON_CONSD... |
1426 |
if (i == selected_console) { |
4d0916119 printk: Enable th... |
1427 |
newcon->flags |= CON_CONSDEV; |
ab4af03a4 [PATCH] CON_CONSD... |
1428 1429 |
preferred_console = selected_console; } |
1da177e4c Linux-2.6.12-rc2 |
1430 1431 |
break; } |
4d0916119 printk: Enable th... |
1432 |
if (!(newcon->flags & CON_ENABLED)) |
1da177e4c Linux-2.6.12-rc2 |
1433 |
return; |
8259cf434 printk: Ensure th... |
1434 1435 1436 1437 1438 1439 1440 |
/* * 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... |
1441 |
newcon->flags &= ~CON_PRINTBUFFER; |
1da177e4c Linux-2.6.12-rc2 |
1442 1443 1444 1445 1446 |
/* * Put this console in the list - keep the * preferred driver at the head of the list. */ |
ac751efa6 console: rename a... |
1447 |
console_lock(); |
4d0916119 printk: Enable th... |
1448 1449 1450 1451 1452 |
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 |
1453 |
} else { |
4d0916119 printk: Enable th... |
1454 1455 |
newcon->next = console_drivers->next; console_drivers->next = newcon; |
1da177e4c Linux-2.6.12-rc2 |
1456 |
} |
4d0916119 printk: Enable th... |
1457 |
if (newcon->flags & CON_PRINTBUFFER) { |
1da177e4c Linux-2.6.12-rc2 |
1458 |
/* |
ac751efa6 console: rename a... |
1459 |
* console_unlock(); will print out the buffered messages |
1da177e4c Linux-2.6.12-rc2 |
1460 1461 1462 1463 1464 |
* for us. */ spin_lock_irqsave(&logbuf_lock, flags); con_start = log_start; spin_unlock_irqrestore(&logbuf_lock, flags); |
fe3d8ad31 console: prevent ... |
1465 1466 1467 1468 1469 1470 |
/* * 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 |
1471 |
} |
ac751efa6 console: rename a... |
1472 |
console_unlock(); |
fbc92a345 tty: add 'active'... |
1473 |
console_sysfs_notify(); |
8259cf434 printk: Ensure th... |
1474 1475 1476 1477 1478 1479 1480 1481 |
/* * 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... |
1482 1483 1484 |
if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && !keep_bootcon) { |
8259cf434 printk: Ensure th... |
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 |
/* 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 |
1500 1501 |
} EXPORT_SYMBOL(register_console); |
40dc56512 [PATCH] cleanup f... |
1502 |
int unregister_console(struct console *console) |
1da177e4c Linux-2.6.12-rc2 |
1503 |
{ |
40dc56512 [PATCH] cleanup f... |
1504 |
struct console *a, *b; |
1da177e4c Linux-2.6.12-rc2 |
1505 |
int res = 1; |
f7511d5f6 Basic braille scr... |
1506 1507 1508 1509 |
#ifdef CONFIG_A11Y_BRAILLE_CONSOLE if (console->flags & CON_BRL) return braille_unregister_console(console); #endif |
ac751efa6 console: rename a... |
1510 |
console_lock(); |
1da177e4c Linux-2.6.12-rc2 |
1511 1512 1513 |
if (console_drivers == console) { console_drivers=console->next; res = 0; |
e9b15b54d [PATCH] Fix crash... |
1514 |
} else if (console_drivers) { |
1da177e4c Linux-2.6.12-rc2 |
1515 1516 1517 1518 1519 1520 |
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... |
1521 |
} |
1da177e4c Linux-2.6.12-rc2 |
1522 1523 |
} } |
40dc56512 [PATCH] cleanup f... |
1524 |
|
69331af79 Fixes and cleanup... |
1525 |
/* |
ab4af03a4 [PATCH] CON_CONSD... |
1526 1527 |
* 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 |
1528 |
*/ |
69331af79 Fixes and cleanup... |
1529 |
if (console_drivers != NULL && console->flags & CON_CONSDEV) |
ab4af03a4 [PATCH] CON_CONSD... |
1530 |
console_drivers->flags |= CON_CONSDEV; |
1da177e4c Linux-2.6.12-rc2 |
1531 |
|
ac751efa6 console: rename a... |
1532 |
console_unlock(); |
fbc92a345 tty: add 'active'... |
1533 |
console_sysfs_notify(); |
1da177e4c Linux-2.6.12-rc2 |
1534 1535 1536 |
return res; } EXPORT_SYMBOL(unregister_console); |
d59745ce3 [PATCH] clean up ... |
1537 |
|
034260d67 printk: fix delay... |
1538 |
static int __init printk_late_init(void) |
0c5564bd9 ensure we don't u... |
1539 |
{ |
4d0916119 printk: Enable th... |
1540 1541 1542 1543 |
struct console *con; for_each_console(con) { if (con->flags & CON_BOOT) { |
cb00e99c0 fix - ensure we d... |
1544 1545 |
printk(KERN_INFO "turn off boot console %s%d ", |
4d0916119 printk: Enable th... |
1546 |
con->name, con->index); |
42c2c8c85 printk: Fix "prin... |
1547 |
unregister_console(con); |
cb00e99c0 fix - ensure we d... |
1548 |
} |
0c5564bd9 ensure we don't u... |
1549 |
} |
034260d67 printk: fix delay... |
1550 |
hotcpu_notifier(console_cpu_notify, 0); |
0c5564bd9 ensure we don't u... |
1551 1552 |
return 0; } |
034260d67 printk: fix delay... |
1553 |
late_initcall(printk_late_init); |
0c5564bd9 ensure we don't u... |
1554 |
|
7ef3d2fd1 printk_ratelimit(... |
1555 |
#if defined CONFIG_PRINTK |
717115e1a printk ratelimiti... |
1556 |
|
1da177e4c Linux-2.6.12-rc2 |
1557 1558 1559 |
/* * printk rate limiting, lifted from the networking subsystem. * |
641de9d8f printk: fix comme... |
1560 1561 |
* 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 |
1562 |
*/ |
641de9d8f printk: fix comme... |
1563 |
DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10); |
5c8287133 ratelimit: Make s... |
1564 |
int __printk_ratelimit(const char *func) |
1da177e4c Linux-2.6.12-rc2 |
1565 |
{ |
5c8287133 ratelimit: Make s... |
1566 |
return ___ratelimit(&printk_ratelimit_state, func); |
1da177e4c Linux-2.6.12-rc2 |
1567 |
} |
5c8287133 ratelimit: Make s... |
1568 |
EXPORT_SYMBOL(__printk_ratelimit); |
f46c48335 [PATCH] Add print... |
1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 |
/** * 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... |
1582 1583 1584 1585 1586 |
if (*caller_jiffies == 0 || !time_in_range(jiffies, *caller_jiffies, *caller_jiffies + msecs_to_jiffies(interval_msecs))) { *caller_jiffies = jiffies; |
f46c48335 [PATCH] Add print... |
1587 1588 1589 1590 1591 |
return true; } return false; } EXPORT_SYMBOL(printk_timed_ratelimit); |
456b565cc core: Add kernel ... |
1592 1593 1594 1595 1596 1597 |
static DEFINE_SPINLOCK(dump_list_lock); static LIST_HEAD(dump_list); /** * kmsg_dump_register - register a kernel log dumper. |
6485536bc printk: fix new k... |
1598 |
* @dumper: pointer to the kmsg_dumper structure |
456b565cc core: Add kernel ... |
1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 |
* * 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... |
1617 |
list_add_tail_rcu(&dumper->list, &dump_list); |
456b565cc core: Add kernel ... |
1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 |
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... |
1628 |
* @dumper: pointer to the kmsg_dumper structure |
456b565cc core: Add kernel ... |
1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 |
* * 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... |
1641 |
list_del_rcu(&dumper->list); |
456b565cc core: Add kernel ... |
1642 1643 1644 |
err = 0; } spin_unlock_irqrestore(&dump_list_lock, flags); |
fb842b00c printk: use RCU t... |
1645 |
synchronize_rcu(); |
456b565cc core: Add kernel ... |
1646 1647 1648 1649 |
return err; } EXPORT_SYMBOL_GPL(kmsg_dump_unregister); |
456b565cc core: Add kernel ... |
1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 |
/** * 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. */ spin_lock_irqsave(&logbuf_lock, flags); end = log_end & LOG_BUF_MASK; chars = logged_chars; spin_unlock_irqrestore(&logbuf_lock, flags); |
8c4af38e9 gcc-4.6: printk: ... |
1673 1674 1675 |
if (chars > end) { s1 = log_buf + log_buf_len - chars + end; l1 = chars - end; |
456b565cc core: Add kernel ... |
1676 1677 1678 1679 1680 1681 |
s2 = log_buf; l2 = end; } else { s1 = ""; l1 = 0; |
8c4af38e9 gcc-4.6: printk: ... |
1682 1683 |
s2 = log_buf + end - chars; l2 = chars; |
456b565cc core: Add kernel ... |
1684 |
} |
fb842b00c printk: use RCU t... |
1685 1686 |
rcu_read_lock(); list_for_each_entry_rcu(dumper, &dump_list, list) |
456b565cc core: Add kernel ... |
1687 |
dumper->dump(dumper, reason, s1, l1, s2, l2); |
fb842b00c printk: use RCU t... |
1688 |
rcu_read_unlock(); |
456b565cc core: Add kernel ... |
1689 |
} |
7ef3d2fd1 printk_ratelimit(... |
1690 |
#endif |