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 | /* |