Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69331af7 authored by Gerd Hoffmann's avatar Gerd Hoffmann Committed by Linus Torvalds
Browse files

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).

Changes to last version: Rediffed against -rc3, adapted to mips cleanups by
Ralf, fixed "udbg-immortal" cmd line arg on powerpc.

Signed-off-by: default avatarGerd Hoffmann <kraxel@exsuse.de>
Acked-by: default avatarPaul Mundt <lethal@linux-sh.org>
Acked-by: default avatarRalf 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>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6ae9200f
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -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",
+1 −1
Original line number Diff line number Diff line
@@ -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,
};

+0 −5
Original line number Diff line number Diff line
@@ -33,8 +33,3 @@ void __init setup_early_printk(void)
{
	register_console(&early_console);
}

void __init disable_early_printk(void)
{
	unregister_console(&early_console);
}
+6 −13
Original line number Diff line number Diff line
@@ -142,29 +142,22 @@ static void udbg_console_write(struct console *con, const char *s,
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)
{
	if (early_console_initialized)
		return;

	if (strstr(boot_command_line, "udbg-immortal")) {
		printk(KERN_INFO "early console immortal !\n");
		udbg_console.flags &= ~CON_BOOT;
	}
	early_console_initialized = 1;
	register_console(&udbg_console);
}
+6 −12
Original line number Diff line number Diff line
@@ -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");
}
Loading