diff options
Diffstat (limited to 'kernel/printk.c')
| -rw-r--r-- | kernel/printk.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 0bbdeac2810c..051d27e36a6c 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -449,13 +449,16 @@ static int printk_time = 1; | |||
| 449 | #else | 449 | #else |
| 450 | static int printk_time = 0; | 450 | static int printk_time = 0; |
| 451 | #endif | 451 | #endif |
| 452 | module_param(printk_time, int, S_IRUGO | S_IWUSR); | 452 | module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); |
| 453 | 453 | ||
| 454 | static int __init printk_time_setup(char *str) | 454 | static int __init printk_time_setup(char *str) |
| 455 | { | 455 | { |
| 456 | if (*str) | 456 | if (*str) |
| 457 | return 0; | 457 | return 0; |
| 458 | printk_time = 1; | 458 | printk_time = 1; |
| 459 | printk(KERN_NOTICE "The 'time' option is deprecated and " | ||
| 460 | "is scheduled for removal in early 2008\n"); | ||
| 461 | printk(KERN_NOTICE "Use 'printk.time=<value>' instead\n"); | ||
| 459 | return 1; | 462 | return 1; |
| 460 | } | 463 | } |
| 461 | 464 | ||
| @@ -483,6 +486,9 @@ static int have_callable_console(void) | |||
| 483 | * @fmt: format string | 486 | * @fmt: format string |
| 484 | * | 487 | * |
| 485 | * This is printk(). It can be called from any context. We want it to work. | 488 | * This is printk(). It can be called from any context. We want it to work. |
| 489 | * Be aware of the fact that if oops_in_progress is not set, we might try to | ||
| 490 | * wake klogd up which could deadlock on runqueue lock if printk() is called | ||
| 491 | * from scheduler code. | ||
| 486 | * | 492 | * |
| 487 | * We try to grab the console_sem. If we succeed, it's easy - we log the output and | 493 | * We try to grab the console_sem. If we succeed, it's easy - we log the output and |
| 488 | * call the console drivers. If we fail to get the semaphore we place the output | 494 | * call the console drivers. If we fail to get the semaphore we place the output |
| @@ -654,7 +660,7 @@ static void call_console_drivers(unsigned long start, unsigned long end) | |||
| 654 | */ | 660 | */ |
| 655 | static int __init console_setup(char *str) | 661 | static int __init console_setup(char *str) |
| 656 | { | 662 | { |
| 657 | char name[sizeof(console_cmdline[0].name)]; | 663 | char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */ |
| 658 | char *s, *options; | 664 | char *s, *options; |
| 659 | int idx; | 665 | int idx; |
| 660 | 666 | ||
| @@ -662,27 +668,27 @@ static int __init console_setup(char *str) | |||
| 662 | * Decode str into name, index, options. | 668 | * Decode str into name, index, options. |
| 663 | */ | 669 | */ |
| 664 | if (str[0] >= '0' && str[0] <= '9') { | 670 | if (str[0] >= '0' && str[0] <= '9') { |
| 665 | strcpy(name, "ttyS"); | 671 | strcpy(buf, "ttyS"); |
| 666 | strncpy(name + 4, str, sizeof(name) - 5); | 672 | strncpy(buf + 4, str, sizeof(buf) - 5); |
| 667 | } else { | 673 | } else { |
| 668 | strncpy(name, str, sizeof(name) - 1); | 674 | strncpy(buf, str, sizeof(buf) - 1); |
| 669 | } | 675 | } |
| 670 | name[sizeof(name) - 1] = 0; | 676 | buf[sizeof(buf) - 1] = 0; |
| 671 | if ((options = strchr(str, ',')) != NULL) | 677 | if ((options = strchr(str, ',')) != NULL) |
| 672 | *(options++) = 0; | 678 | *(options++) = 0; |
| 673 | #ifdef __sparc__ | 679 | #ifdef __sparc__ |
| 674 | if (!strcmp(str, "ttya")) | 680 | if (!strcmp(str, "ttya")) |
| 675 | strcpy(name, "ttyS0"); | 681 | strcpy(buf, "ttyS0"); |
| 676 | if (!strcmp(str, "ttyb")) | 682 | if (!strcmp(str, "ttyb")) |
| 677 | strcpy(name, "ttyS1"); | 683 | strcpy(buf, "ttyS1"); |
| 678 | #endif | 684 | #endif |
| 679 | for (s = name; *s; s++) | 685 | for (s = buf; *s; s++) |
| 680 | if ((*s >= '0' && *s <= '9') || *s == ',') | 686 | if ((*s >= '0' && *s <= '9') || *s == ',') |
| 681 | break; | 687 | break; |
| 682 | idx = simple_strtoul(s, NULL, 10); | 688 | idx = simple_strtoul(s, NULL, 10); |
| 683 | *s = 0; | 689 | *s = 0; |
| 684 | 690 | ||
| 685 | add_preferred_console(name, idx, options); | 691 | add_preferred_console(buf, idx, options); |
| 686 | return 1; | 692 | return 1; |
| 687 | } | 693 | } |
| 688 | __setup("console=", console_setup); | 694 | __setup("console=", console_setup); |
| @@ -709,7 +715,7 @@ int __init add_preferred_console(char *name, int idx, char *options) | |||
| 709 | * See if this tty is not yet registered, and | 715 | * See if this tty is not yet registered, and |
| 710 | * if we have a slot free. | 716 | * if we have a slot free. |
| 711 | */ | 717 | */ |
| 712 | for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) | 718 | for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) |
| 713 | if (strcmp(console_cmdline[i].name, name) == 0 && | 719 | if (strcmp(console_cmdline[i].name, name) == 0 && |
| 714 | console_cmdline[i].index == idx) { | 720 | console_cmdline[i].index == idx) { |
| 715 | selected_console = i; | 721 | selected_console = i; |
| @@ -726,6 +732,25 @@ int __init add_preferred_console(char *name, int idx, char *options) | |||
| 726 | return 0; | 732 | return 0; |
| 727 | } | 733 | } |
| 728 | 734 | ||
| 735 | int __init update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options) | ||
| 736 | { | ||
| 737 | struct console_cmdline *c; | ||
| 738 | int i; | ||
| 739 | |||
| 740 | for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) | ||
| 741 | if (strcmp(console_cmdline[i].name, name) == 0 && | ||
| 742 | console_cmdline[i].index == idx) { | ||
| 743 | c = &console_cmdline[i]; | ||
| 744 | memcpy(c->name, name_new, sizeof(c->name)); | ||
| 745 | c->name[sizeof(c->name) - 1] = 0; | ||
| 746 | c->options = options; | ||
| 747 | c->index = idx_new; | ||
| 748 | return i; | ||
| 749 | } | ||
| 750 | /* not found */ | ||
| 751 | return -1; | ||
| 752 | } | ||
| 753 | |||
| 729 | #ifndef CONFIG_DISABLE_CONSOLE_SUSPEND | 754 | #ifndef CONFIG_DISABLE_CONSOLE_SUSPEND |
| 730 | /** | 755 | /** |
| 731 | * suspend_console - suspend the console subsystem | 756 | * suspend_console - suspend the console subsystem |
| @@ -942,6 +967,9 @@ void register_console(struct console *console) | |||
| 942 | if (preferred_console < 0 || bootconsole || !console_drivers) | 967 | if (preferred_console < 0 || bootconsole || !console_drivers) |
| 943 | preferred_console = selected_console; | 968 | preferred_console = selected_console; |
| 944 | 969 | ||
| 970 | if (console->early_setup) | ||
| 971 | console->early_setup(); | ||
| 972 | |||
| 945 | /* | 973 | /* |
| 946 | * See if we want to use this console driver. If we | 974 | * See if we want to use this console driver. If we |
| 947 | * didn't select a console we take the first one | 975 | * didn't select a console we take the first one |
| @@ -985,12 +1013,15 @@ void register_console(struct console *console) | |||
| 985 | if (!(console->flags & CON_ENABLED)) | 1013 | if (!(console->flags & CON_ENABLED)) |
| 986 | return; | 1014 | return; |
| 987 | 1015 | ||
| 988 | if (bootconsole) { | 1016 | if (bootconsole && (console->flags & CON_CONSDEV)) { |
| 989 | printk(KERN_INFO "console handover: boot [%s%d] -> real [%s%d]\n", | 1017 | printk(KERN_INFO "console handover: boot [%s%d] -> real [%s%d]\n", |
| 990 | bootconsole->name, bootconsole->index, | 1018 | bootconsole->name, bootconsole->index, |
| 991 | console->name, console->index); | 1019 | console->name, console->index); |
| 992 | unregister_console(bootconsole); | 1020 | unregister_console(bootconsole); |
| 993 | console->flags &= ~CON_PRINTBUFFER; | 1021 | console->flags &= ~CON_PRINTBUFFER; |
| 1022 | } else { | ||
| 1023 | printk(KERN_INFO "console [%s%d] enabled\n", | ||
| 1024 | console->name, console->index); | ||
| 994 | } | 1025 | } |
| 995 | 1026 | ||
| 996 | /* | 1027 | /* |
