diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-04 21:39:31 -0500 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-04 21:39:31 -0500 |
| commit | c2cc87ca9561ddfe744d446789cc10f507e87db9 (patch) | |
| tree | d505fc0110eb1a3d8750ba2f67648c131f0d9aca /kernel/printk.c | |
| parent | ce1eeb95fc4eb25109c00bea3e83a87eeff6b07d (diff) | |
| parent | 7015faa7df829876a0f931cd18aa6d7c24a1b581 (diff) | |
Merge branch 'master'
Diffstat (limited to 'kernel/printk.c')
| -rw-r--r-- | kernel/printk.c | 78 |
1 files changed, 42 insertions, 36 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 4b8f0f9230a4..3cb9708209bc 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * elsewhere, in preparation for a serial line console (someday). | 10 | * elsewhere, in preparation for a serial line console (someday). |
| 11 | * Ted Ts'o, 2/11/93. | 11 | * Ted Ts'o, 2/11/93. |
| 12 | * Modified for sysctl support, 1/8/97, Chris Horn. | 12 | * Modified for sysctl support, 1/8/97, Chris Horn. |
| 13 | * Fixed SMP synchronization, 08/08/99, Manfred Spraul | 13 | * Fixed SMP synchronization, 08/08/99, Manfred Spraul |
| 14 | * manfreds@colorfullife.com | 14 | * manfreds@colorfullife.com |
| 15 | * Rewrote bits to get rid of console_lock | 15 | * Rewrote bits to get rid of console_lock |
| 16 | * 01Mar01 Andrew Morton <andrewm@uow.edu.au> | 16 | * 01Mar01 Andrew Morton <andrewm@uow.edu.au> |
| @@ -148,7 +148,7 @@ static int __init console_setup(char *str) | |||
| 148 | if (!strcmp(str, "ttyb")) | 148 | if (!strcmp(str, "ttyb")) |
| 149 | strcpy(name, "ttyS1"); | 149 | strcpy(name, "ttyS1"); |
| 150 | #endif | 150 | #endif |
| 151 | for(s = name; *s; s++) | 151 | for (s = name; *s; s++) |
| 152 | if ((*s >= '0' && *s <= '9') || *s == ',') | 152 | if ((*s >= '0' && *s <= '9') || *s == ',') |
| 153 | break; | 153 | break; |
| 154 | idx = simple_strtoul(s, NULL, 10); | 154 | idx = simple_strtoul(s, NULL, 10); |
| @@ -169,11 +169,11 @@ static int __init log_buf_len_setup(char *str) | |||
| 169 | size = roundup_pow_of_two(size); | 169 | size = roundup_pow_of_two(size); |
| 170 | if (size > log_buf_len) { | 170 | if (size > log_buf_len) { |
| 171 | unsigned long start, dest_idx, offset; | 171 | unsigned long start, dest_idx, offset; |
| 172 | char * new_log_buf; | 172 | char *new_log_buf; |
| 173 | 173 | ||
| 174 | new_log_buf = alloc_bootmem(size); | 174 | new_log_buf = alloc_bootmem(size); |
| 175 | if (!new_log_buf) { | 175 | if (!new_log_buf) { |
| 176 | printk("log_buf_len: allocation failed\n"); | 176 | printk(KERN_WARNING "log_buf_len: allocation failed\n"); |
| 177 | goto out; | 177 | goto out; |
| 178 | } | 178 | } |
| 179 | 179 | ||
| @@ -193,10 +193,9 @@ static int __init log_buf_len_setup(char *str) | |||
| 193 | log_end -= offset; | 193 | log_end -= offset; |
| 194 | spin_unlock_irqrestore(&logbuf_lock, flags); | 194 | spin_unlock_irqrestore(&logbuf_lock, flags); |
| 195 | 195 | ||
| 196 | printk("log_buf_len: %d\n", log_buf_len); | 196 | printk(KERN_NOTICE "log_buf_len: %d\n", log_buf_len); |
| 197 | } | 197 | } |
| 198 | out: | 198 | out: |
| 199 | |||
| 200 | return 1; | 199 | return 1; |
| 201 | } | 200 | } |
| 202 | 201 | ||
| @@ -217,7 +216,7 @@ __setup("log_buf_len=", log_buf_len_setup); | |||
| 217 | * 9 -- Return number of unread characters in the log buffer | 216 | * 9 -- Return number of unread characters in the log buffer |
| 218 | * 10 -- Return size of the log buffer | 217 | * 10 -- Return size of the log buffer |
| 219 | */ | 218 | */ |
| 220 | int do_syslog(int type, char __user * buf, int len) | 219 | int do_syslog(int type, char __user *buf, int len) |
| 221 | { | 220 | { |
| 222 | unsigned long i, j, limit, count; | 221 | unsigned long i, j, limit, count; |
| 223 | int do_clear = 0; | 222 | int do_clear = 0; |
| @@ -244,7 +243,8 @@ int do_syslog(int type, char __user * buf, int len) | |||
| 244 | error = -EFAULT; | 243 | error = -EFAULT; |
| 245 | goto out; | 244 | goto out; |
| 246 | } | 245 | } |
| 247 | error = wait_event_interruptible(log_wait, (log_start - log_end)); | 246 | error = wait_event_interruptible(log_wait, |
| 247 | (log_start - log_end)); | ||
| 248 | if (error) | 248 | if (error) |
| 249 | goto out; | 249 | goto out; |
| 250 | i = 0; | 250 | i = 0; |
| @@ -264,7 +264,7 @@ int do_syslog(int type, char __user * buf, int len) | |||
| 264 | error = i; | 264 | error = i; |
| 265 | break; | 265 | break; |
| 266 | case 4: /* Read/clear last kernel messages */ | 266 | case 4: /* Read/clear last kernel messages */ |
| 267 | do_clear = 1; | 267 | do_clear = 1; |
| 268 | /* FALL THRU */ | 268 | /* FALL THRU */ |
| 269 | case 3: /* Read last kernel messages */ | 269 | case 3: /* Read last kernel messages */ |
| 270 | error = -EINVAL; | 270 | error = -EINVAL; |
| @@ -288,11 +288,11 @@ int do_syslog(int type, char __user * buf, int len) | |||
| 288 | limit = log_end; | 288 | limit = log_end; |
| 289 | /* | 289 | /* |
| 290 | * __put_user() could sleep, and while we sleep | 290 | * __put_user() could sleep, and while we sleep |
| 291 | * printk() could overwrite the messages | 291 | * printk() could overwrite the messages |
| 292 | * we try to copy to user space. Therefore | 292 | * we try to copy to user space. Therefore |
| 293 | * the messages are copied in reverse. <manfreds> | 293 | * the messages are copied in reverse. <manfreds> |
| 294 | */ | 294 | */ |
| 295 | for(i = 0; i < count && !error; i++) { | 295 | for (i = 0; i < count && !error; i++) { |
| 296 | j = limit-1-i; | 296 | j = limit-1-i; |
| 297 | if (j + log_buf_len < log_end) | 297 | if (j + log_buf_len < log_end) |
| 298 | break; | 298 | break; |
| @@ -306,10 +306,10 @@ int do_syslog(int type, char __user * buf, int len) | |||
| 306 | if (error) | 306 | if (error) |
| 307 | break; | 307 | break; |
| 308 | error = i; | 308 | error = i; |
| 309 | if(i != count) { | 309 | if (i != count) { |
| 310 | int offset = count-error; | 310 | int offset = count-error; |
| 311 | /* buffer overflow during copy, correct user buffer. */ | 311 | /* buffer overflow during copy, correct user buffer. */ |
| 312 | for(i=0;i<error;i++) { | 312 | for (i = 0; i < error; i++) { |
| 313 | if (__get_user(c,&buf[i+offset]) || | 313 | if (__get_user(c,&buf[i+offset]) || |
| 314 | __put_user(c,&buf[i])) { | 314 | __put_user(c,&buf[i])) { |
| 315 | error = -EFAULT; | 315 | error = -EFAULT; |
| @@ -351,7 +351,7 @@ out: | |||
| 351 | return error; | 351 | return error; |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | asmlinkage long sys_syslog(int type, char __user * buf, int len) | 354 | asmlinkage long sys_syslog(int type, char __user *buf, int len) |
| 355 | { | 355 | { |
| 356 | return do_syslog(type, buf, len); | 356 | return do_syslog(type, buf, len); |
| 357 | } | 357 | } |
| @@ -404,21 +404,19 @@ static void call_console_drivers(unsigned long start, unsigned long end) | |||
| 404 | cur_index = start; | 404 | cur_index = start; |
| 405 | start_print = start; | 405 | start_print = start; |
| 406 | while (cur_index != end) { | 406 | while (cur_index != end) { |
| 407 | if ( msg_level < 0 && | 407 | if (msg_level < 0 && ((end - cur_index) > 2) && |
| 408 | ((end - cur_index) > 2) && | 408 | LOG_BUF(cur_index + 0) == '<' && |
| 409 | LOG_BUF(cur_index + 0) == '<' && | 409 | LOG_BUF(cur_index + 1) >= '0' && |
| 410 | LOG_BUF(cur_index + 1) >= '0' && | 410 | LOG_BUF(cur_index + 1) <= '7' && |
| 411 | LOG_BUF(cur_index + 1) <= '7' && | 411 | LOG_BUF(cur_index + 2) == '>') { |
| 412 | LOG_BUF(cur_index + 2) == '>') | ||
| 413 | { | ||
| 414 | msg_level = LOG_BUF(cur_index + 1) - '0'; | 412 | msg_level = LOG_BUF(cur_index + 1) - '0'; |
| 415 | cur_index += 3; | 413 | cur_index += 3; |
| 416 | start_print = cur_index; | 414 | start_print = cur_index; |
| 417 | } | 415 | } |
| 418 | while (cur_index != end) { | 416 | while (cur_index != end) { |
| 419 | char c = LOG_BUF(cur_index); | 417 | char c = LOG_BUF(cur_index); |
| 420 | cur_index++; | ||
| 421 | 418 | ||
| 419 | cur_index++; | ||
| 422 | if (c == '\n') { | 420 | if (c == '\n') { |
| 423 | if (msg_level < 0) { | 421 | if (msg_level < 0) { |
| 424 | /* | 422 | /* |
| @@ -461,7 +459,7 @@ static void zap_locks(void) | |||
| 461 | static unsigned long oops_timestamp; | 459 | static unsigned long oops_timestamp; |
| 462 | 460 | ||
| 463 | if (time_after_eq(jiffies, oops_timestamp) && | 461 | if (time_after_eq(jiffies, oops_timestamp) && |
| 464 | !time_after(jiffies, oops_timestamp + 30*HZ)) | 462 | !time_after(jiffies, oops_timestamp + 30 * HZ)) |
| 465 | return; | 463 | return; |
| 466 | 464 | ||
| 467 | oops_timestamp = jiffies; | 465 | oops_timestamp = jiffies; |
| @@ -495,7 +493,7 @@ __attribute__((weak)) unsigned long long printk_clock(void) | |||
| 495 | 493 | ||
| 496 | /* | 494 | /* |
| 497 | * This is printk. It can be called from any context. We want it to work. | 495 | * This is printk. It can be called from any context. We want it to work. |
| 498 | * | 496 | * |
| 499 | * We try to grab the console_sem. If we succeed, it's easy - we log the output and | 497 | * We try to grab the console_sem. If we succeed, it's easy - we log the output and |
| 500 | * call the console drivers. If we fail to get the semaphore we place the output | 498 | * call the console drivers. If we fail to get the semaphore we place the output |
| 501 | * into the log buffer and return. The current holder of the console_sem will | 499 | * into the log buffer and return. The current holder of the console_sem will |
| @@ -639,13 +637,19 @@ EXPORT_SYMBOL(vprintk); | |||
| 639 | 637 | ||
| 640 | #else | 638 | #else |
| 641 | 639 | ||
| 642 | asmlinkage long sys_syslog(int type, char __user * buf, int len) | 640 | asmlinkage long sys_syslog(int type, char __user *buf, int len) |
| 643 | { | 641 | { |
| 644 | return 0; | 642 | return 0; |
| 645 | } | 643 | } |
| 646 | 644 | ||
| 647 | int do_syslog(int type, char __user * buf, int len) { return 0; } | 645 | int do_syslog(int type, char __user *buf, int len) |
| 648 | static void call_console_drivers(unsigned long start, unsigned long end) {} | 646 | { |
| 647 | return 0; | ||
| 648 | } | ||
| 649 | |||
| 650 | static void call_console_drivers(unsigned long start, unsigned long end) | ||
| 651 | { | ||
| 652 | } | ||
| 649 | 653 | ||
| 650 | #endif | 654 | #endif |
| 651 | 655 | ||
| @@ -851,9 +855,9 @@ EXPORT_SYMBOL(console_start); | |||
| 851 | * print any messages that were printed by the kernel before the | 855 | * print any messages that were printed by the kernel before the |
| 852 | * console driver was initialized. | 856 | * console driver was initialized. |
| 853 | */ | 857 | */ |
| 854 | void register_console(struct console * console) | 858 | void register_console(struct console *console) |
| 855 | { | 859 | { |
| 856 | int i; | 860 | int i; |
| 857 | unsigned long flags; | 861 | unsigned long flags; |
| 858 | 862 | ||
| 859 | if (preferred_console < 0) | 863 | if (preferred_console < 0) |
| @@ -878,7 +882,8 @@ void register_console(struct console * console) | |||
| 878 | * See if this console matches one we selected on | 882 | * See if this console matches one we selected on |
| 879 | * the command line. | 883 | * the command line. |
| 880 | */ | 884 | */ |
| 881 | for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) { | 885 | for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; |
| 886 | i++) { | ||
| 882 | if (strcmp(console_cmdline[i].name, console->name) != 0) | 887 | if (strcmp(console_cmdline[i].name, console->name) != 0) |
| 883 | continue; | 888 | continue; |
| 884 | if (console->index >= 0 && | 889 | if (console->index >= 0 && |
| @@ -933,9 +938,9 @@ void register_console(struct console * console) | |||
| 933 | } | 938 | } |
| 934 | EXPORT_SYMBOL(register_console); | 939 | EXPORT_SYMBOL(register_console); |
| 935 | 940 | ||
| 936 | int unregister_console(struct console * console) | 941 | int unregister_console(struct console *console) |
| 937 | { | 942 | { |
| 938 | struct console *a,*b; | 943 | struct console *a, *b; |
| 939 | int res = 1; | 944 | int res = 1; |
| 940 | 945 | ||
| 941 | acquire_console_sem(); | 946 | acquire_console_sem(); |
| @@ -949,10 +954,10 @@ int unregister_console(struct console * console) | |||
| 949 | b->next = a->next; | 954 | b->next = a->next; |
| 950 | res = 0; | 955 | res = 0; |
| 951 | break; | 956 | break; |
| 952 | } | 957 | } |
| 953 | } | 958 | } |
| 954 | } | 959 | } |
| 955 | 960 | ||
| 956 | /* If last console is removed, we re-enable picking the first | 961 | /* If last console is removed, we re-enable picking the first |
| 957 | * one that gets registered. Without that, pmac early boot console | 962 | * one that gets registered. Without that, pmac early boot console |
| 958 | * would prevent fbcon from taking over. | 963 | * would prevent fbcon from taking over. |
| @@ -994,7 +999,7 @@ void tty_write_message(struct tty_struct *tty, char *msg) | |||
| 994 | int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst) | 999 | int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst) |
| 995 | { | 1000 | { |
| 996 | static DEFINE_SPINLOCK(ratelimit_lock); | 1001 | static DEFINE_SPINLOCK(ratelimit_lock); |
| 997 | static unsigned long toks = 10*5*HZ; | 1002 | static unsigned long toks = 10 * 5 * HZ; |
| 998 | static unsigned long last_msg; | 1003 | static unsigned long last_msg; |
| 999 | static int missed; | 1004 | static int missed; |
| 1000 | unsigned long flags; | 1005 | unsigned long flags; |
| @@ -1007,6 +1012,7 @@ int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst) | |||
| 1007 | toks = ratelimit_burst * ratelimit_jiffies; | 1012 | toks = ratelimit_burst * ratelimit_jiffies; |
| 1008 | if (toks >= ratelimit_jiffies) { | 1013 | if (toks >= ratelimit_jiffies) { |
| 1009 | int lost = missed; | 1014 | int lost = missed; |
| 1015 | |||
| 1010 | missed = 0; | 1016 | missed = 0; |
| 1011 | toks -= ratelimit_jiffies; | 1017 | toks -= ratelimit_jiffies; |
| 1012 | spin_unlock_irqrestore(&ratelimit_lock, flags); | 1018 | spin_unlock_irqrestore(&ratelimit_lock, flags); |
| @@ -1021,7 +1027,7 @@ int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst) | |||
| 1021 | EXPORT_SYMBOL(__printk_ratelimit); | 1027 | EXPORT_SYMBOL(__printk_ratelimit); |
| 1022 | 1028 | ||
| 1023 | /* minimum time in jiffies between messages */ | 1029 | /* minimum time in jiffies between messages */ |
| 1024 | int printk_ratelimit_jiffies = 5*HZ; | 1030 | int printk_ratelimit_jiffies = 5 * HZ; |
| 1025 | 1031 | ||
| 1026 | /* number of messages we send before ratelimiting */ | 1032 | /* number of messages we send before ratelimiting */ |
| 1027 | int printk_ratelimit_burst = 10; | 1033 | int printk_ratelimit_burst = 10; |
