LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [patch] Fixes and cleanups for earlyprintk aka boot console.
@ 2007-02-20 11:35 Gerd Hoffmann
  2007-03-02  7:46 ` Andrew Morton
  2007-03-05  4:15 ` Paul Mackerras
  0 siblings, 2 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2007-02-20 11:35 UTC (permalink / raw)
  To: linux kernel mailing list; +Cc: Jeremy Fitzhardinge, Andrew Morton

[-- Attachment #1: Type: text/plain, Size: 1335 bytes --]

  Hi,

The console subsystem already has an idea of a boot console, using the
CON_BOOT flag.  The implementation has some flaws though.  The major
problem is that presence of a boot console makes register_console()
ignore any other console devices (unless explicitly specified on the
kernel command line).

This patch fixes the console selection code to *not* consider a boot
console a full-featured one, so the first non-boot console registering
will become the default console instead.  This way the unregister call
for the boot console in the register_console() function actually
triggers and the handover from the boot console to the real console
device works smoothly.  Added a printk for the handover, so you know
which console device the output goes to when the boot console stops
printing messages.

The disable_early_printk() call is obsolete with that patch, explicitly
disabling the early console isn't needed any more as it works
automagically with that patch.

I've walked through the tree, dropped all disable_early_printk()
instances found below arch/ and tagged the consoles with CON_BOOT if
needed.

The code is tested on x86 only so far.  It is probably a good idea to
run it in -mm for a while to shake out any architecture issues which
might show up.  Comments?

cheers,

  Gerd

-- 
Gerd Hoffmann <kraxel@suse.de>

[-- Attachment #2: early-printk-boot-console.patch --]
[-- Type: text/x-patch, Size: 10596 bytes --]

Fixes and cleanups for earlyprintk aka boot console.

The console subsystem already has an idea of a boot console, using the
CON_BOOT flag.  The implementation has some flaws though.  The major
problem is that presence of a boot console makes register_console()
ignore any other console devices (unless explicitly specified on the
kernel command line).

This patch fixes the console selection code to *not* consider a boot
console a full-featured one, so the first non-boot console registering
will become the default console instead.  This way the unregister call
for the boot console in the register_console() function actually
triggers and the handover from the boot console to the real console
device works smoothly.  Added a printk for the handover, so you know
which console device the output goes to when the boot console stops
printing messages.

The disable_early_printk() call is obsolete with that patch, explicitly
disabling the early console isn't needed any more as it works
automagically with that patch.

I've walked through the tree, dropped all disable_early_printk()
instances found below arch/ and tagged the consoles with CON_BOOT if
needed.  The code is tested on x86 only so far.

Signed-off-by: Gerd Hoffmann <kraxel@suse.de>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
---
 arch/alpha/kernel/setup.c         |    9 ---------
 arch/alpha/kernel/srmcons.c       |    2 +-
 arch/mips/cobalt/console.c        |    5 -----
 arch/mips/dec/prom/console.c      |    5 +----
 arch/mips/sgi-ip27/ip27-console.c |    5 -----
 arch/powerpc/kernel/udbg.c        |   14 +-------------
 arch/sh/kernel/early_printk.c     |   18 ++++++------------
 arch/sh64/kernel/early_printk.c   |    8 +-------
 arch/x86_64/kernel/early_printk.c |   20 +++++---------------
 drivers/char/tty_io.c             |    5 -----
 kernel/printk.c                   |   26 ++++++++++++++++----------
 11 files changed, 31 insertions(+), 86 deletions(-)

===================================================================
Index: paravirt-2.6.20-git14-hg791/arch/x86_64/kernel/early_printk.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/x86_64/kernel/early_printk.c
+++ paravirt-2.6.20-git14-hg791/arch/x86_64/kernel/early_printk.c
@@ -244,22 +244,12 @@ static int __init setup_early_printk(cha
  		early_console = &simnow_console;
  		keep_early = 1;
 	}
+
+	if (keep_early)
+		early_console->flags &= ~CON_BOOT;
+	else
+		early_console->flags |= CON_BOOT;
 	register_console(early_console);
 	return 0;
 }
-
 early_param("earlyprintk", setup_early_printk);
-
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized || !early_console)
-		return;
-	if (!keep_early) {
-		printk("disabling early console\n");
-		unregister_console(early_console);
-		early_console_initialized = 0;
-	} else {
-		printk("keeping early console\n");
-	}
-}
-
Index: paravirt-2.6.20-git14-hg791/kernel/printk.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/kernel/printk.c
+++ paravirt-2.6.20-git14-hg791/kernel/printk.c
@@ -931,8 +931,16 @@ void register_console(struct console *co
 {
 	int i;
 	unsigned long flags;
+	struct console *bootconsole = NULL;
 
-	if (preferred_console < 0)
+	if (console_drivers) {
+		if (console->flags & CON_BOOT)
+			return;
+		if (console_drivers->flags & CON_BOOT)
+			bootconsole = console_drivers;
+	}
+
+	if (preferred_console < 0 || bootconsole || !console_drivers)
 		preferred_console = selected_console;
 
 	/*
@@ -978,8 +986,11 @@ void register_console(struct console *co
 	if (!(console->flags & CON_ENABLED))
 		return;
 
-	if (console_drivers && (console_drivers->flags & CON_BOOT)) {
-		unregister_console(console_drivers);
+	if (bootconsole) {
+		printk(KERN_INFO "console handover: boot [%s%d] -> real [%s%d]\n",
+		       bootconsole->name, bootconsole->index,
+		       console->name, console->index);
+		unregister_console(bootconsole);
 		console->flags &= ~CON_PRINTBUFFER;
 	}
 
@@ -1030,16 +1041,11 @@ int unregister_console(struct console *c
 		}
 	}
 
-	/* If last console is removed, we re-enable picking the first
-	 * one that gets registered. Without that, pmac early boot console
-	 * would prevent fbcon from taking over.
-	 *
+	/*
 	 * If this isn't the last console and it has CON_CONSDEV set, we
 	 * need to set it on the next preferred console.
 	 */
-	if (console_drivers == NULL)
-		preferred_console = selected_console;
-	else if (console->flags & CON_CONSDEV)
+	if (console_drivers != NULL && console->flags & CON_CONSDEV)
 		console_drivers->flags |= CON_CONSDEV;
 
 	release_console_sem();
Index: paravirt-2.6.20-git14-hg791/drivers/char/tty_io.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/drivers/char/tty_io.c
+++ paravirt-2.6.20-git14-hg791/drivers/char/tty_io.c
@@ -141,8 +141,6 @@ static DECLARE_MUTEX(allocated_ptys_lock
 static int ptmx_open(struct inode *, struct file *);
 #endif
 
-extern void disable_early_printk(void);
-
 static void initialize_tty_struct(struct tty_struct *tty);
 
 static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
@@ -3880,9 +3878,6 @@ void __init console_init(void)
 	 * set up the console device so that later boot sequences can 
 	 * inform about problems etc..
 	 */
-#ifdef CONFIG_EARLY_PRINTK
-	disable_early_printk();
-#endif
 	call = __con_initcall_start;
 	while (call < __con_initcall_end) {
 		(*call)();
Index: paravirt-2.6.20-git14-hg791/arch/alpha/kernel/setup.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/alpha/kernel/setup.c
+++ paravirt-2.6.20-git14-hg791/arch/alpha/kernel/setup.c
@@ -744,15 +744,6 @@ setup_arch(char **cmdline_p)
 	paging_init();
 }
 
-void __init
-disable_early_printk(void)
-{
-	if (alpha_using_srm && srmcons_output) {
-		unregister_srm_console();
-		srmcons_output = 0;
-	}
-}
-
 static char sys_unknown[] = "Unknown";
 static char systype_names[][16] = {
 	"0",
Index: paravirt-2.6.20-git14-hg791/arch/alpha/kernel/srmcons.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/alpha/kernel/srmcons.c
+++ paravirt-2.6.20-git14-hg791/arch/alpha/kernel/srmcons.c
@@ -300,7 +300,7 @@ static struct console srmcons = {
 	.write		= srm_console_write,
 	.device		= srm_console_device,
 	.setup		= srm_console_setup,
-	.flags		= CON_PRINTBUFFER,
+	.flags		= CON_PRINTBUFFER | CON_BOOT,
 	.index		= -1,
 };
 
Index: paravirt-2.6.20-git14-hg791/arch/mips/cobalt/console.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/mips/cobalt/console.c
+++ paravirt-2.6.20-git14-hg791/arch/mips/cobalt/console.c
@@ -40,8 +40,3 @@ void __init cobalt_early_console(void)
 
 	printk("Cobalt: early console registered\n");
 }
-
-void __init disable_early_printk(void)
-{
-	unregister_console(&cons_info);
-}
Index: paravirt-2.6.20-git14-hg791/arch/mips/dec/prom/console.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/mips/dec/prom/console.c
+++ paravirt-2.6.20-git14-hg791/arch/mips/dec/prom/console.c
@@ -29,7 +29,7 @@ static void __init prom_console_write(st
 static struct console promcons __initdata = {
 	.name	= "prom",
 	.write	= prom_console_write,
-	.flags	= CON_PRINTBUFFER,
+	.flags	= CON_PRINTBUFFER | CON_BOOT,
 	.index	= -1,
 };
 
@@ -50,6 +50,3 @@ void __init unregister_prom_console(void
 		promcons_output = 0;
 	}
 }
-
-void disable_early_printk(void)
-	__attribute__((alias("unregister_prom_console")));
Index: paravirt-2.6.20-git14-hg791/arch/mips/sgi-ip27/ip27-console.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/mips/sgi-ip27/ip27-console.c
+++ paravirt-2.6.20-git14-hg791/arch/mips/sgi-ip27/ip27-console.c
@@ -67,8 +67,3 @@ __init void ip27_setup_console(void)
 {
 	register_console(&ioc3_console);
 }
-
-void __init disable_early_printk(void)
-{
-	unregister_console(&ioc3_console);
-}
Index: paravirt-2.6.20-git14-hg791/arch/powerpc/kernel/udbg.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/powerpc/kernel/udbg.c
+++ paravirt-2.6.20-git14-hg791/arch/powerpc/kernel/udbg.c
@@ -142,24 +142,12 @@ static void udbg_console_write(struct co
 static struct console udbg_console = {
 	.name	= "udbg",
 	.write	= udbg_console_write,
-	.flags	= CON_PRINTBUFFER | CON_ENABLED,
+	.flags	= CON_PRINTBUFFER | CON_ENABLED | CON_BOOT,
 	.index	= -1,
 };
 
 static int early_console_initialized;
 
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized)
-		return;
-	if (strstr(boot_command_line, "udbg-immortal")) {
-		printk(KERN_INFO "early console immortal !\n");
-		return;
-	}
-	unregister_console(&udbg_console);
-	early_console_initialized = 0;
-}
-
 /* called by setup_system */
 void register_early_udbg_console(void)
 {
Index: paravirt-2.6.20-git14-hg791/arch/sh/kernel/early_printk.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/sh/kernel/early_printk.c
+++ paravirt-2.6.20-git14-hg791/arch/sh/kernel/early_printk.c
@@ -192,20 +192,14 @@ int __init setup_early_printk(char *buf)
 	}
 #endif
 
-	if (likely(early_console))
+	if (likely(early_console)) {
+		if (keep_early)
+			early_console->flags &= ~CON_BOOT;
+		else
+			early_console->flags |= CON_BOOT;
 		register_console(early_console);
+	}
 
 	return 0;
 }
 early_param("earlyprintk", setup_early_printk);
-
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized || !early_console)
-		return;
-	if (!keep_early) {
-		printk("disabling early console\n");
-		unregister_console(early_console);
-	} else
-		printk("keeping early console\n");
-}
Index: paravirt-2.6.20-git14-hg791/arch/sh64/kernel/early_printk.c
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/sh64/kernel/early_printk.c
+++ paravirt-2.6.20-git14-hg791/arch/sh64/kernel/early_printk.c
@@ -79,7 +79,7 @@ static struct console sh_console = {
 	.name		= "scifcon",
 	.write		= sh_console_write,
 	.setup		= sh_console_setup,
-	.flags		= CON_PRINTBUFFER,
+	.flags		= CON_PRINTBUFFER | CON_BOOT,
 	.index		= -1,
 };
 
@@ -97,9 +97,3 @@ void __init enable_early_printk(void)
 
 	register_console(&sh_console);
 }
-
-void disable_early_printk(void)
-{
-	unregister_console(&sh_console);
-}
-

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] Fixes and cleanups for earlyprintk aka boot console.
  2007-02-20 11:35 [patch] Fixes and cleanups for earlyprintk aka boot console Gerd Hoffmann
@ 2007-03-02  7:46 ` Andrew Morton
  2007-03-02  9:52   ` Gerd Hoffmann
  2007-03-05  4:15 ` Paul Mackerras
  1 sibling, 1 reply; 7+ messages in thread
From: Andrew Morton @ 2007-03-02  7:46 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: linux kernel mailing list, Jeremy Fitzhardinge

On Tue, 20 Feb 2007 12:35:49 +0100 Gerd Hoffmann <kraxel@suse.de> wrote:

> The console subsystem already has an idea of a boot console, using the
> CON_BOOT flag.  The implementation has some flaws though.  The major
> problem is that presence of a boot console makes register_console()
> ignore any other console devices (unless explicitly specified on the
> kernel command line).
> 
> This patch fixes the console selection code to *not* consider a boot
> console a full-featured one, so the first non-boot console registering
> will become the default console instead.  This way the unregister call
> for the boot console in the register_console() function actually
> triggers and the handover from the boot console to the real console
> device works smoothly.  Added a printk for the handover, so you know
> which console device the output goes to when the boot console stops
> printing messages.
> 
> The disable_early_printk() call is obsolete with that patch, explicitly
> disabling the early console isn't needed any more as it works
> automagically with that patch.
> 
> I've walked through the tree, dropped all disable_early_printk()
> instances found below arch/ and tagged the consoles with CON_BOOT if
> needed.
> 
> The code is tested on x86 only so far.  It is probably a good idea to
> run it in -mm for a while to shake out any architecture issues which
> might show up.  Comments?

It blows up on powerpc:

drivers/built-in.o(.init.text+0x2080): In function `.console_init':
: undefined reference to `.disable_early_printk'

and the below patch might help.

But my confidence level isn't high so I'll drop it for now.  I have a feeling
this will need careful testing.

--- a/arch/x86_64/kernel/early_printk.c~fixes-and-cleanups-for-earlyprintk-aka-boot-console-fix
+++ a/arch/x86_64/kernel/early_printk.c
@@ -249,17 +249,3 @@ static int __init setup_early_printk(cha
 }
 
 early_param("earlyprintk", setup_early_printk);
-
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized || !early_console)
-		return;
-	if (!keep_early) {
-		printk("disabling early console\n");
-		unregister_console(early_console);
-		early_console_initialized = 0;
-	} else {
-		printk("keeping early console\n");
-	}
-}
-
diff -puN drivers/char/tty_io.c~fixes-and-cleanups-for-earlyprintk-aka-boot-console-fix drivers/char/tty_io.c
--- a/drivers/char/tty_io.c~fixes-and-cleanups-for-earlyprintk-aka-boot-console-fix
+++ a/drivers/char/tty_io.c
@@ -141,8 +141,6 @@ static DECLARE_MUTEX(allocated_ptys_lock
 static int ptmx_open(struct inode *, struct file *);
 #endif
 
-extern void disable_early_printk(void);
-
 static void initialize_tty_struct(struct tty_struct *tty);
 
 static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
@@ -3889,13 +3887,6 @@ void __init console_init(void)
 	/* Setup the default TTY line discipline. */
 	(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
 
-	/*
-	 * set up the console device so that later boot sequences can 
-	 * inform about problems etc..
-	 */
-#ifdef CONFIG_EARLY_PRINTK
-	disable_early_printk();
-#endif
 	call = __con_initcall_start;
 	while (call < __con_initcall_end) {
 		(*call)();
_


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] Fixes and cleanups for earlyprintk aka boot console.
  2007-03-02  7:46 ` Andrew Morton
@ 2007-03-02  9:52   ` Gerd Hoffmann
  2007-03-02 16:06     ` Jeremy Fitzhardinge
  0 siblings, 1 reply; 7+ messages in thread
From: Gerd Hoffmann @ 2007-03-02  9:52 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux kernel mailing list, Jeremy Fitzhardinge

[-- Attachment #1: Type: text/plain, Size: 651 bytes --]

Andrew Morton wrote:
> On Tue, 20 Feb 2007 12:35:49 +0100 Gerd Hoffmann <kraxel@suse.de> wrote:
> 
> It blows up on powerpc:

> drivers/built-in.o(.init.text+0x2080): In function `.console_init':
> : undefined reference to `.disable_early_printk'

Hmm, I think this is just a chunk being lost due to the clash with the
older version of the patch submitted as part of the xen series.

Here is the most recent version.  No code changes, comments updated (ack
from sh and mips arch maintainers).

Last patch queue mailed by Jeremy doesn't contain this one any more, so
the conflict should be gone now.

cheers,
  Gerd

-- 
Gerd Hoffmann <kraxel@suse.de>

[-- Attachment #2: early-printk-boot-console.patch --]
[-- Type: text/x-patch, Size: 10208 bytes --]

Fixes and cleanups for earlyprintk aka boot console.

The console subsystem already has an idea of a boot console, using the
CON_BOOT flag.  The implementation has some flaws though.  The major
problem is that presence of a boot console makes register_console()
ignore any other console devices (unless explicitly specified on the
kernel command line).

This patch fixes the console selection code to *not* consider a boot
console a full-featured one, so the first non-boot console registering
will become the default console instead.  This way the unregister call
for the boot console in the register_console() function actually
triggers and the handover from the boot console to the real console
device works smoothly.  Added a printk for the handover, so you know
which console device the output goes to when the boot console stops
printing messages.

The disable_early_printk() call is obsolete with that patch, explicitly
disabling the early console isn't needed any more as it works
automagically with that patch.

I've walked through the tree, dropped all disable_early_printk()
instances found below arch/ and tagged the consoles with CON_BOOT if
needed.  The code is tested on x86, sh (thanks to Paul) and mips
(thanks to Ralf).

Signed-off-by: Gerd Hoffmann <kraxel@suse.de>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Andi Kleen <ak@suse.de>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
---
 arch/alpha/kernel/setup.c         |    9 ---------
 arch/alpha/kernel/srmcons.c       |    2 +-
 arch/mips/cobalt/console.c        |    5 -----
 arch/mips/dec/prom/console.c      |    5 +----
 arch/mips/sgi-ip27/ip27-console.c |    5 -----
 arch/powerpc/kernel/udbg.c        |   14 +-------------
 arch/sh/kernel/early_printk.c     |   18 ++++++------------
 arch/sh64/kernel/early_printk.c   |    8 +-------
 arch/x86_64/kernel/early_printk.c |   20 +++++---------------
 drivers/char/tty_io.c             |    5 -----
 kernel/printk.c                   |   26 ++++++++++++++++----------
 11 files changed, 31 insertions(+), 86 deletions(-)

===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/x86_64/kernel/early_printk.c
+++ paravirt-2.6.20-git14-hg791/arch/x86_64/kernel/early_printk.c
@@ -244,22 +244,12 @@ static int __init setup_early_printk(cha
  		early_console = &simnow_console;
  		keep_early = 1;
 	}
+
+	if (keep_early)
+		early_console->flags &= ~CON_BOOT;
+	else
+		early_console->flags |= CON_BOOT;
 	register_console(early_console);
 	return 0;
 }
-
 early_param("earlyprintk", setup_early_printk);
-
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized || !early_console)
-		return;
-	if (!keep_early) {
-		printk("disabling early console\n");
-		unregister_console(early_console);
-		early_console_initialized = 0;
-	} else {
-		printk("keeping early console\n");
-	}
-}
-
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/kernel/printk.c
+++ paravirt-2.6.20-git14-hg791/kernel/printk.c
@@ -931,8 +931,16 @@ void register_console(struct console *co
 {
 	int i;
 	unsigned long flags;
+	struct console *bootconsole = NULL;
 
-	if (preferred_console < 0)
+	if (console_drivers) {
+		if (console->flags & CON_BOOT)
+			return;
+		if (console_drivers->flags & CON_BOOT)
+			bootconsole = console_drivers;
+	}
+
+	if (preferred_console < 0 || bootconsole || !console_drivers)
 		preferred_console = selected_console;
 
 	/*
@@ -978,8 +986,11 @@ void register_console(struct console *co
 	if (!(console->flags & CON_ENABLED))
 		return;
 
-	if (console_drivers && (console_drivers->flags & CON_BOOT)) {
-		unregister_console(console_drivers);
+	if (bootconsole) {
+		printk(KERN_INFO "console handover: boot [%s%d] -> real [%s%d]\n",
+		       bootconsole->name, bootconsole->index,
+		       console->name, console->index);
+		unregister_console(bootconsole);
 		console->flags &= ~CON_PRINTBUFFER;
 	}
 
@@ -1030,16 +1041,11 @@ int unregister_console(struct console *c
 		}
 	}
 
-	/* If last console is removed, we re-enable picking the first
-	 * one that gets registered. Without that, pmac early boot console
-	 * would prevent fbcon from taking over.
-	 *
+	/*
 	 * If this isn't the last console and it has CON_CONSDEV set, we
 	 * need to set it on the next preferred console.
 	 */
-	if (console_drivers == NULL)
-		preferred_console = selected_console;
-	else if (console->flags & CON_CONSDEV)
+	if (console_drivers != NULL && console->flags & CON_CONSDEV)
 		console_drivers->flags |= CON_CONSDEV;
 
 	release_console_sem();
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/drivers/char/tty_io.c
+++ paravirt-2.6.20-git14-hg791/drivers/char/tty_io.c
@@ -141,8 +141,6 @@ static DECLARE_MUTEX(allocated_ptys_lock
 static int ptmx_open(struct inode *, struct file *);
 #endif
 
-extern void disable_early_printk(void);
-
 static void initialize_tty_struct(struct tty_struct *tty);
 
 static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
@@ -3880,9 +3878,6 @@ void __init console_init(void)
 	 * set up the console device so that later boot sequences can 
 	 * inform about problems etc..
 	 */
-#ifdef CONFIG_EARLY_PRINTK
-	disable_early_printk();
-#endif
 	call = __con_initcall_start;
 	while (call < __con_initcall_end) {
 		(*call)();
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/alpha/kernel/setup.c
+++ paravirt-2.6.20-git14-hg791/arch/alpha/kernel/setup.c
@@ -744,15 +744,6 @@ setup_arch(char **cmdline_p)
 	paging_init();
 }
 
-void __init
-disable_early_printk(void)
-{
-	if (alpha_using_srm && srmcons_output) {
-		unregister_srm_console();
-		srmcons_output = 0;
-	}
-}
-
 static char sys_unknown[] = "Unknown";
 static char systype_names[][16] = {
 	"0",
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/alpha/kernel/srmcons.c
+++ paravirt-2.6.20-git14-hg791/arch/alpha/kernel/srmcons.c
@@ -300,7 +300,7 @@ static struct console srmcons = {
 	.write		= srm_console_write,
 	.device		= srm_console_device,
 	.setup		= srm_console_setup,
-	.flags		= CON_PRINTBUFFER,
+	.flags		= CON_PRINTBUFFER | CON_BOOT,
 	.index		= -1,
 };
 
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/mips/cobalt/console.c
+++ paravirt-2.6.20-git14-hg791/arch/mips/cobalt/console.c
@@ -40,8 +40,3 @@ void __init cobalt_early_console(void)
 
 	printk("Cobalt: early console registered\n");
 }
-
-void __init disable_early_printk(void)
-{
-	unregister_console(&cons_info);
-}
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/mips/dec/prom/console.c
+++ paravirt-2.6.20-git14-hg791/arch/mips/dec/prom/console.c
@@ -29,7 +29,7 @@ static void __init prom_console_write(st
 static struct console promcons __initdata = {
 	.name	= "prom",
 	.write	= prom_console_write,
-	.flags	= CON_PRINTBUFFER,
+	.flags	= CON_PRINTBUFFER | CON_BOOT,
 	.index	= -1,
 };
 
@@ -50,6 +50,3 @@ void __init unregister_prom_console(void
 		promcons_output = 0;
 	}
 }
-
-void disable_early_printk(void)
-	__attribute__((alias("unregister_prom_console")));
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/mips/sgi-ip27/ip27-console.c
+++ paravirt-2.6.20-git14-hg791/arch/mips/sgi-ip27/ip27-console.c
@@ -67,8 +67,3 @@ __init void ip27_setup_console(void)
 {
 	register_console(&ioc3_console);
 }
-
-void __init disable_early_printk(void)
-{
-	unregister_console(&ioc3_console);
-}
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/powerpc/kernel/udbg.c
+++ paravirt-2.6.20-git14-hg791/arch/powerpc/kernel/udbg.c
@@ -142,24 +142,12 @@ static void udbg_console_write(struct co
 static struct console udbg_console = {
 	.name	= "udbg",
 	.write	= udbg_console_write,
-	.flags	= CON_PRINTBUFFER | CON_ENABLED,
+	.flags	= CON_PRINTBUFFER | CON_ENABLED | CON_BOOT,
 	.index	= -1,
 };
 
 static int early_console_initialized;
 
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized)
-		return;
-	if (strstr(boot_command_line, "udbg-immortal")) {
-		printk(KERN_INFO "early console immortal !\n");
-		return;
-	}
-	unregister_console(&udbg_console);
-	early_console_initialized = 0;
-}
-
 /* called by setup_system */
 void register_early_udbg_console(void)
 {
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/sh/kernel/early_printk.c
+++ paravirt-2.6.20-git14-hg791/arch/sh/kernel/early_printk.c
@@ -192,20 +192,14 @@ int __init setup_early_printk(char *buf)
 	}
 #endif
 
-	if (likely(early_console))
+	if (likely(early_console)) {
+		if (keep_early)
+			early_console->flags &= ~CON_BOOT;
+		else
+			early_console->flags |= CON_BOOT;
 		register_console(early_console);
+	}
 
 	return 0;
 }
 early_param("earlyprintk", setup_early_printk);
-
-void __init disable_early_printk(void)
-{
-	if (!early_console_initialized || !early_console)
-		return;
-	if (!keep_early) {
-		printk("disabling early console\n");
-		unregister_console(early_console);
-	} else
-		printk("keeping early console\n");
-}
===================================================================
--- paravirt-2.6.20-git14-hg791.orig/arch/sh64/kernel/early_printk.c
+++ paravirt-2.6.20-git14-hg791/arch/sh64/kernel/early_printk.c
@@ -79,7 +79,7 @@ static struct console sh_console = {
 	.name		= "scifcon",
 	.write		= sh_console_write,
 	.setup		= sh_console_setup,
-	.flags		= CON_PRINTBUFFER,
+	.flags		= CON_PRINTBUFFER | CON_BOOT,
 	.index		= -1,
 };
 
@@ -97,9 +97,3 @@ void __init enable_early_printk(void)
 
 	register_console(&sh_console);
 }
-
-void disable_early_printk(void)
-{
-	unregister_console(&sh_console);
-}
-

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] Fixes and cleanups for earlyprintk aka boot console.
  2007-03-02  9:52   ` Gerd Hoffmann
@ 2007-03-02 16:06     ` Jeremy Fitzhardinge
  2007-03-02 16:38       ` Gerd Hoffmann
  0 siblings, 1 reply; 7+ messages in thread
From: Jeremy Fitzhardinge @ 2007-03-02 16:06 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Andrew Morton, linux kernel mailing list

Gerd Hoffmann wrote:
> Hmm, I think this is just a chunk being lost due to the clash with the
> older version of the patch submitted as part of the xen series.
>   

But I thought the old version I had posted was well and truly dropped. 
Isn't this problematic patch the one you posted?

> Last patch queue mailed by Jeremy doesn't contain this one any more, so
> the conflict should be gone now.
>   
Yeah, this isn't absolutely required to make Xen work, so I didn't want
to confuse things by reposting it.

    J

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] Fixes and cleanups for earlyprintk aka boot console.
  2007-03-02 16:06     ` Jeremy Fitzhardinge
@ 2007-03-02 16:38       ` Gerd Hoffmann
  0 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2007-03-02 16:38 UTC (permalink / raw)
  To: Jeremy Fitzhardinge; +Cc: Andrew Morton, linux kernel mailing list

Jeremy Fitzhardinge wrote:
> Gerd Hoffmann wrote:
>> Hmm, I think this is just a chunk being lost due to the clash with the
>> older version of the patch submitted as part of the xen series.
> 
> But I thought the old version I had posted was well and truly dropped. 
> Isn't this problematic patch the one you posted?

I think what happened is (the patch attached to the "removed from -mm"
mail looks like this):

  - patch-v2 merged into -mm
  - patch-v1 merged into -mm as part of xen series
  - merge conflict, the bits which are in patch-v1 got removed
    from patch-v2 to solve that, both patches in -mm
  - patch-v1 got removed with other xen bits due to the conflict
    with zachs patches.
  - mm kernel has an incomplete patch-v2 now => boom.

So it isn't a problem with the original patch, it just got corrupted
during conflict resolving.

cheers,
  Gerd

-- 
Gerd Hoffmann <kraxel@suse.de>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] Fixes and cleanups for earlyprintk aka boot console.
  2007-02-20 11:35 [patch] Fixes and cleanups for earlyprintk aka boot console Gerd Hoffmann
  2007-03-02  7:46 ` Andrew Morton
@ 2007-03-05  4:15 ` Paul Mackerras
  2007-03-05  7:38   ` Gerd Hoffmann
  1 sibling, 1 reply; 7+ messages in thread
From: Paul Mackerras @ 2007-03-05  4:15 UTC (permalink / raw)
  To: Gerd Hoffmann
  Cc: linux kernel mailing list, Jeremy Fitzhardinge, Andrew Morton, benh

Gerd Hoffmann writes:

> This patch fixes the console selection code to *not* consider a boot
> console a full-featured one, so the first non-boot console registering
> will become the default console instead.  This way the unregister call
> for the boot console in the register_console() function actually
> triggers and the handover from the boot console to the real console
> device works smoothly.  Added a printk for the handover, so you know
> which console device the output goes to when the boot console stops
> printing messages.

You have removed functionality that is useful for debugging, that 3
architectures had, namely a way to keep using the early boot console
and not replace it with a console that comes later, using a kernel
command line option.  Perhaps you could provide a way to do that in
your patch.

Paul.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] Fixes and cleanups for earlyprintk aka boot console.
  2007-03-05  4:15 ` Paul Mackerras
@ 2007-03-05  7:38   ` Gerd Hoffmann
  0 siblings, 0 replies; 7+ messages in thread
From: Gerd Hoffmann @ 2007-03-05  7:38 UTC (permalink / raw)
  To: Paul Mackerras
  Cc: linux kernel mailing list, Jeremy Fitzhardinge, Andrew Morton, benh

Paul Mackerras wrote:
> Gerd Hoffmann writes:
> 
>> This patch fixes the console selection code to *not* consider a boot
>> console a full-featured one, so the first non-boot console registering
>> will become the default console instead.  This way the unregister call
>> for the boot console in the register_console() function actually
>> triggers and the handover from the boot console to the real console
>> device works smoothly.  Added a printk for the handover, so you know
>> which console device the output goes to when the boot console stops
>> printing messages.
> 
> You have removed functionality that is useful for debugging, that 3
> architectures had, namely a way to keep using the early boot console
> and not replace it with a console that comes later, using a kernel
> command line option.  Perhaps you could provide a way to do that in
> your patch.

--verbose please.  I don't think I broke that.

I've seen code for that in i386/x86_64 and one of the other archs (via
earlyprintk=foo,keep).  The code clears now the CON_BOOT flag in case
keep is present, which has the wanted effect:  The earlyprintk console
will not be replaced.

cheers,
  Gerd

-- 
Gerd Hoffmann <kraxel@suse.de>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-03-05  7:38 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-20 11:35 [patch] Fixes and cleanups for earlyprintk aka boot console Gerd Hoffmann
2007-03-02  7:46 ` Andrew Morton
2007-03-02  9:52   ` Gerd Hoffmann
2007-03-02 16:06     ` Jeremy Fitzhardinge
2007-03-02 16:38       ` Gerd Hoffmann
2007-03-05  4:15 ` Paul Mackerras
2007-03-05  7:38   ` Gerd Hoffmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).