linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
@ 2015-05-26 13:06 Alexander Kuleshov
  2015-05-26 13:07 ` [PATCH v8 1/3] x86/setup: introduce setup_bultin_cmdline Alexander Kuleshov
                   ` (3 more replies)
  0 siblings, 4 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 13:06 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: Alexander Kuleshov, Andy Shevchenko, LKML, Greg Kroah-Hartman,
	Borislav Petkov, Mark Rustad, Yinghai Lu

The early_printk function is usable only after the setup_early_printk will
be executed. We pass 'earlyprintk' through the kernel command line. So, it
means that earlyprintk will be usable only after the 'parse_early_param'
will be executed. We have usable earlyprintk only during early boot, kernel
decompression and after call of the 'parse_early_param'. This patchset makes
serial earlyprintk usable before the call of the 'parse_early_param'.

Patchset was tested for both x86 and x86_64 architectures with the qemu.

These patchset provides following changes:

1. Move handling of the builtin command line to the separate function
from the setup_arch. Now we can call it from the arch/x86/kernel/head{32,64}.c,
and find 'earlyprintk' kernel command line paramter there.

2. Provide setup_serial_console function to setup serial earlyprintk in the
arch/x86/kernel/head{32,64}.c

v8:

* Fixed warning with the definition of the setup_early_serial_console
in the arch/x86/include/asm/setup.h

v7:

* Move setup_early_serial_console to the the arch/x86/include/setup.h
* Add ifdefs to prevent setup_serial_console if CONFIG_EARLY_PRINTK
is not set.

v6:

* Style fixes.
* Call of the suetp_builtin_cmdline moved to the separate patch.

v5:

* Call setup_builtin_cmdline instead of setup_cmdline

v4:

* Move setup_early_serial_console from the include/linux/printk.h
to the arch/x86/include/asm/serial.h, because this function is only
for x86 now.

v3:

* Call setup_cmdline before setup_early_printk;
* setup_early_printk call wrapped with the setup_early_serial_console which
checks that 'serial' given to the earlyprintk command line option. This
prevents call of the setup_early_printk with the given pciserial/dbgp/efi,
because they are using early_ioremap.

v2:

* Comment added before the setup_early_printk call;
* Added information about testing to the commit message.

Alexander Kuleshov (3):
  x86/setup: introduce setup_bultin_cmdline
  x86/setup: handle builtin command line as early as possible
  x86/earlyprintk: setup earlyprintk as early as possible

 arch/x86/include/asm/setup.h   |  8 ++++++++
 arch/x86/kernel/early_printk.c | 24 ++++++++++++++++++++++++
 arch/x86/kernel/head32.c       |  7 +++++++
 arch/x86/kernel/head64.c       |  7 +++++++
 arch/x86/kernel/setup.c        | 33 ++++++++++++++++++---------------
 5 files changed, 64 insertions(+), 15 deletions(-)

--
2.4.0.350.g9532ead


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

* [PATCH v8 1/3] x86/setup: introduce setup_bultin_cmdline
  2015-05-26 13:06 [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible Alexander Kuleshov
@ 2015-05-26 13:07 ` Alexander Kuleshov
  2015-05-26 13:07 ` [PATCH v8 2/3] x86/setup: handle builtin command line as early as possible Alexander Kuleshov
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 13:07 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: Alexander Kuleshov, Andy Shevchenko, LKML, Greg Kroah-Hartman,
	Borislav Petkov, Mark Rustad, Yinghai Lu

This patch introduces the setup_builtin_cmdline function which appends or
overrides boot_command_line with the builtin_cmdline if CONFIG_CMDLINE_BOOL
is set.

Previously this functional was in the setup_arch, but we need to move
it for getting actual command line as early as possible in the
arch/x86/kernel/head{32,64}.c for the earlyprintk setup.

Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
---
 arch/x86/include/asm/setup.h |  1 +
 arch/x86/kernel/setup.c      | 34 +++++++++++++++++++---------------
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index f69e06b..59efd0d 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -119,6 +119,7 @@ asmlinkage void __init x86_64_start_kernel(char *real_mode);
 asmlinkage void __init x86_64_start_reservations(char *real_mode_data);
 
 #endif /* __i386__ */
+void __init setup_builtin_cmdline(void);
 #endif /* _SETUP */
 #else
 #define RESERVE_BRK(name,sz)				\
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index d74ac33..28dea1c 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -733,7 +733,7 @@ static void __init trim_snb_memory(void)
 	 * already been reserved.
 	 */
 	memblock_reserve(0, 1<<20);
-	
+
 	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) {
 		if (memblock_reserve(bad_pages[i], PAGE_SIZE))
 			printk(KERN_WARNING "failed to reserve 0x%08lx\n",
@@ -825,7 +825,7 @@ static void __init trim_low_memory_range(void)
 {
 	memblock_reserve(0, ALIGN(reserve_low, PAGE_SIZE));
 }
-	
+
 /*
  * Dump out kernel offset information on panic.
  */
@@ -845,6 +845,22 @@ dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p)
 	return 0;
 }
 
+void __init setup_builtin_cmdline(void)
+{
+#ifdef CONFIG_CMDLINE_BOOL
+#ifdef CONFIG_CMDLINE_OVERRIDE
+	strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+#else
+	if (builtin_cmdline[0]) {
+		/* append boot loader cmdline to builtin */
+		strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
+		strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+	}
+#endif
+#endif
+}
+
 /*
  * Determine if we were loaded by an EFI loader.  If so, then we have also been
  * passed the efi memmap, systab, etc., so we should use these data structures
@@ -973,19 +989,7 @@ void __init setup_arch(char **cmdline_p)
 	bss_resource.start = __pa_symbol(__bss_start);
 	bss_resource.end = __pa_symbol(__bss_stop)-1;
 
-#ifdef CONFIG_CMDLINE_BOOL
-#ifdef CONFIG_CMDLINE_OVERRIDE
-	strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
-#else
-	if (builtin_cmdline[0]) {
-		/* append boot loader cmdline to builtin */
-		strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
-		strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
-		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
-	}
-#endif
-#endif
-
+	setup_builtin_cmdline();
 	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
 	*cmdline_p = command_line;
 
--
2.4.0.350.g9532ead


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

* [PATCH v8 2/3] x86/setup: handle builtin command line as early as possible
  2015-05-26 13:06 [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible Alexander Kuleshov
  2015-05-26 13:07 ` [PATCH v8 1/3] x86/setup: introduce setup_bultin_cmdline Alexander Kuleshov
@ 2015-05-26 13:07 ` Alexander Kuleshov
  2015-05-26 13:08 ` [PATCH v8 3/3] x86/earlyprintk: setup earlyprintk " Alexander Kuleshov
  2015-05-26 13:17 ` [PATCH v8 0/3] x86/earlyprintk: setup serial " Borislav Petkov
  3 siblings, 0 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 13:07 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: Alexander Kuleshov, Andy Shevchenko, LKML, Greg Kroah-Hartman,
	Borislav Petkov, Mark Rustad, Yinghai Lu

This patch adds the call of the setup_builtin_cmdline to
handle builtin command line before we will setup earlyprintk.

Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
---
 arch/x86/kernel/head32.c | 1 +
 arch/x86/kernel/head64.c | 2 ++
 arch/x86/kernel/setup.c  | 1 -
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index 2911ef3..92e8b5f 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -31,6 +31,7 @@ static void __init i386_default_early_setup(void)
 
 asmlinkage __visible void __init i386_start_kernel(void)
 {
+	setup_builtin_cmdline();
 	cr4_init_shadow();
 	sanitize_boot_params(&boot_params);
 
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 2b55ee6..346a042 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -172,6 +172,8 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
 
 	copy_bootdata(__va(real_mode_data));
 
+	setup_builtin_cmdline();
+
 	/*
 	 * Load microcode early on BSP.
 	 */
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 28dea1c..12124df 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -989,7 +989,6 @@ void __init setup_arch(char **cmdline_p)
 	bss_resource.start = __pa_symbol(__bss_start);
 	bss_resource.end = __pa_symbol(__bss_stop)-1;
 
-	setup_builtin_cmdline();
 	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
 	*cmdline_p = command_line;
 
--
2.4.0.350.g9532ead


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

* [PATCH v8 3/3] x86/earlyprintk: setup earlyprintk as early as possible
  2015-05-26 13:06 [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible Alexander Kuleshov
  2015-05-26 13:07 ` [PATCH v8 1/3] x86/setup: introduce setup_bultin_cmdline Alexander Kuleshov
  2015-05-26 13:07 ` [PATCH v8 2/3] x86/setup: handle builtin command line as early as possible Alexander Kuleshov
@ 2015-05-26 13:08 ` Alexander Kuleshov
  2015-05-26 13:17 ` [PATCH v8 0/3] x86/earlyprintk: setup serial " Borislav Petkov
  3 siblings, 0 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 13:08 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: Alexander Kuleshov, Andy Shevchenko, LKML, Greg Kroah-Hartman,
	Borislav Petkov, Mark Rustad, Yinghai Lu

The early_printk function is usable only after the setup_early_printk will
be executed. We pass 'earlyprintk' through the kernel command line, so it
will be usable only after the 'parse_early_param' will be executed. This means
that we have usable earlyprintk only during early boot, kernel decompression
and after call of the 'parse_early_param'. This patchset makes earlyprintk
usable before the call of the 'parse_early_param'.

This patch makes the setup_early_printk visible for head{32,64}.c. So the
'early_printk' function will be usabable after decompression of the
kernel and before parse_early_param will be called. It also must be
safe if CONFIG_CMDLINE_BOOL and CONFIG_CMDLINE_OVERRIDE are set, because
setup_cmdline function will be called before setup_early_printk.

It provides earlyprintk only for serial console, because other needs in
ioremap which is not initialized yet.

Tested it with qemu, so early_printk() is usable and prints to serial
console right after setup_early_printk function called.

Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
---
 arch/x86/include/asm/setup.h   |  7 +++++++
 arch/x86/kernel/early_printk.c | 24 ++++++++++++++++++++++++
 arch/x86/kernel/head32.c       |  6 ++++++
 arch/x86/kernel/head64.c       |  5 +++++
 4 files changed, 42 insertions(+)

diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index 59efd0d..201eda0 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -120,6 +120,13 @@ asmlinkage void __init x86_64_start_reservations(char *real_mode_data);
 
 #endif /* __i386__ */
 void __init setup_builtin_cmdline(void);
+
+#ifdef CONFIG_EARLY_PRINTK
+/* used by arch/x86/kernel/head{32,64}.c */
+extern int __init setup_early_serial_console(void);
+#else
+static inline int __init setup_early_serial_console(void) { return 0; }
+#endif /* CONFIG_EARLY_PRINTK */
 #endif /* _SETUP */
 #else
 #define RESERVE_BRK(name,sz)				\
diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
index 89427d8..0b2a626 100644
--- a/arch/x86/kernel/early_printk.c
+++ b/arch/x86/kernel/early_printk.c
@@ -385,4 +385,28 @@ static int __init setup_early_printk(char *buf)
 	return 0;
 }
 
+int __init setup_early_serial_console(void)
+{
+	char *arg;
+
+	/*
+	 * make sure that we have:
+	 *      "serial,0x3f8,115200"
+	 *      "serial,ttyS0,115200"
+	 *      "ttyS0,115200"
+	 */
+	arg = strstr(boot_command_line, "earlyprintk=serial");
+	if (!arg)
+		arg = strstr(boot_command_line, "earlyprintk=ttyS");
+	if (!arg)
+		return -1;
+
+	arg = strstr(boot_command_line, "earlyprintk=");
+
+	/* += strlen("earlyprintk"); */
+	arg += 12;
+
+	return setup_early_printk(arg);
+}
+
 early_param("earlyprintk", setup_early_printk);
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index 92e8b5f..759d115 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -32,6 +32,12 @@ static void __init i386_default_early_setup(void)
 asmlinkage __visible void __init i386_start_kernel(void)
 {
 	setup_builtin_cmdline();
+
+	setup_early_serial_console();
+
+	if (console_loglevel >= CONSOLE_LOGLEVEL_DEBUG)
+		early_printk("Early printk is initialized\n");
+
 	cr4_init_shadow();
 	sanitize_boot_params(&boot_params);
 
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 346a042..6b7529a 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -174,6 +174,11 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
 
 	setup_builtin_cmdline();
 
+	setup_early_serial_console();
+
+	if (console_loglevel >= CONSOLE_LOGLEVEL_DEBUG)
+		early_printk("Early printk is initialized\n");
+
 	/*
 	 * Load microcode early on BSP.
 	 */
--
2.4.0.350.g9532ead


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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 13:06 [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible Alexander Kuleshov
                   ` (2 preceding siblings ...)
  2015-05-26 13:08 ` [PATCH v8 3/3] x86/earlyprintk: setup earlyprintk " Alexander Kuleshov
@ 2015-05-26 13:17 ` Borislav Petkov
  2015-05-26 13:20   ` Alexander Kuleshov
  3 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2015-05-26 13:17 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Tue, May 26, 2015 at 07:06:47PM +0600, Alexander Kuleshov wrote:
> The early_printk function is usable only after the setup_early_printk will
> be executed. We pass 'earlyprintk' through the kernel command line. So, it
> means that earlyprintk will be usable only after the 'parse_early_param'
> will be executed. We have usable earlyprintk only during early boot, kernel
> decompression and after call of the 'parse_early_param'. This patchset makes
> serial earlyprintk usable before the call of the 'parse_early_param'.

... and?

Why do we need it usable before parse_early_param()? Use case?

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 13:17 ` [PATCH v8 0/3] x86/earlyprintk: setup serial " Borislav Petkov
@ 2015-05-26 13:20   ` Alexander Kuleshov
  2015-05-26 13:57     ` Borislav Petkov
  0 siblings, 1 reply; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 13:20 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

2015-05-26 19:17 GMT+06:00 Borislav Petkov <bp@suse.de>:
> On Tue, May 26, 2015 at 07:06:47PM +0600, Alexander Kuleshov wrote:
>> The early_printk function is usable only after the setup_early_printk will
>> be executed. We pass 'earlyprintk' through the kernel command line. So, it
>> means that earlyprintk will be usable only after the 'parse_early_param'
>> will be executed. We have usable earlyprintk only during early boot, kernel
>> decompression and after call of the 'parse_early_param'. This patchset makes
>> serial earlyprintk usable before the call of the 'parse_early_param'.
>
> ... and?
>
> Why do we need it usable before parse_early_param()? Use case?
>

To be able to use early_printk and serial console between kernel
decompression and
parse_eary_param.

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 13:20   ` Alexander Kuleshov
@ 2015-05-26 13:57     ` Borislav Petkov
  2015-05-26 14:11       ` Alexander Kuleshov
  0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2015-05-26 13:57 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Tue, May 26, 2015 at 07:20:02PM +0600, Alexander Kuleshov wrote:
> To be able to use early_printk and serial console between kernel
> decompression and parse_eary_param.

So no real use case - only a "just because we can" case.

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 13:57     ` Borislav Petkov
@ 2015-05-26 14:11       ` Alexander Kuleshov
  2015-05-26 14:58         ` Andy Shevchenko
  2015-05-26 21:34         ` Borislav Petkov
  0 siblings, 2 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 14:11 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

2015-05-26 19:57 GMT+06:00 Borislav Petkov <bp@suse.de>:
> On Tue, May 26, 2015 at 07:20:02PM +0600, Alexander Kuleshov wrote:
>> To be able to use early_printk and serial console between kernel
>> decompression and parse_eary_param.
>
> So no real use case - only a "just because we can" case.
>

It is not "just because we can". There is some code after kernel decompression
and before parse_early_param and earlyprintk can be useful for
printing debugging information
in this case.

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 14:11       ` Alexander Kuleshov
@ 2015-05-26 14:58         ` Andy Shevchenko
  2015-05-26 21:34         ` Borislav Petkov
  1 sibling, 0 replies; 18+ messages in thread
From: Andy Shevchenko @ 2015-05-26 14:58 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Borislav Petkov, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Tue, 2015-05-26 at 20:11 +0600, Alexander Kuleshov wrote:
> 2015-05-26 19:57 GMT+06:00 Borislav Petkov <bp@suse.de>:
> > On Tue, May 26, 2015 at 07:20:02PM +0600, Alexander Kuleshov wrote:
> >> To be able to use early_printk and serial console between kernel
> >> decompression and parse_eary_param.
> >
> > So no real use case - only a "just because we can" case.
> >
> 
> It is not "just because we can". There is some code after kernel decompression
> and before parse_early_param and earlyprintk can be useful for
> printing debugging information
> in this case.

So, what is *yours* use case? From here you describe a *potential* use
case, not a real one.

-- 
Andy Shevchenko <andriy.shevchenko@intel.com>
Intel Finland Oy


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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 14:11       ` Alexander Kuleshov
  2015-05-26 14:58         ` Andy Shevchenko
@ 2015-05-26 21:34         ` Borislav Petkov
  2015-05-27  7:33           ` Alexander Kuleshov
  1 sibling, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2015-05-26 21:34 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Tue, May 26, 2015 at 08:11:07PM +0600, Alexander Kuleshov wrote:
> It is not "just because we can". There is some code after kernel
> decompression and before parse_early_param and earlyprintk can be
> useful for printing debugging information in this case.

Which code? Please show me.

Because *that* would be a use case.

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-26 21:34         ` Borislav Petkov
@ 2015-05-27  7:33           ` Alexander Kuleshov
  2015-05-27 12:01             ` Borislav Petkov
  0 siblings, 1 reply; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-27  7:33 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

Hello Borislav,

2015-05-27 3:34 GMT+06:00 Borislav Petkov <bp@suse.de>:
> On Tue, May 26, 2015 at 08:11:07PM +0600, Alexander Kuleshov wrote:
>> It is not "just because we can". There is some code after kernel
>> decompression and before parse_early_param and earlyprintk can be
>> useful for printing debugging information in this case.
>
> Which code? Please show me.
>
> Because *that* would be a use case.

We can't use earlyprintk from the arch/x86/kernel/head{32,64}.c before
parse_early_param from the
arch/x86/kernel/setup.c. But I think you know it better than me. So I
can't understand what's wrong
here, maybe you will give me explanation. I'm very appricate it.

Thank you.

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-27  7:33           ` Alexander Kuleshov
@ 2015-05-27 12:01             ` Borislav Petkov
  2015-05-27 12:12               ` Alexander Kuleshov
  0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2015-05-27 12:01 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Wed, May 27, 2015 at 01:33:23PM +0600, Alexander Kuleshov wrote:
> We can't use earlyprintk from the arch/x86/kernel/head{32,64}.c before
> parse_early_param from the arch/x86/kernel/setup.c.

Yes, and I'm simply asking why do we even want to use it there at all.
What do you think would need to be dumped with early_printk() calls
there and would be useful?

IOW, do you have a sensible use case for why we need it there or not?

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-27 12:01             ` Borislav Petkov
@ 2015-05-27 12:12               ` Alexander Kuleshov
  2015-05-27 12:51                 ` Borislav Petkov
  0 siblings, 1 reply; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-27 12:12 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

2015-05-27 18:01 GMT+06:00 Borislav Petkov <bp@suse.de>:
> Yes, and I'm simply asking why do we even want to use it there at all.
> What do you think would need to be dumped with early_printk() calls
> there and would be useful?
>
> IOW, do you have a sensible use case for why we need it there or not?

Is early printk debugging sensible use case? We have memblock usage on the
early stage which uses printk for debugging which does not work on the
early stage,
early ioremap intitialization, early cpu initialization, many others
stuff and I'm not sure
that this code between head{32,64}.c and parse_early_param will remain
unchanged forever.
Somebody will update/add/remove something from it and ealyprintk
allows us to see what's
going on.

Is it bad or we no need in it? I want to understand not only how
kernel works, but also
why it written so and I can't understand why we have 'earlyprintk' (or
another feature) in
one place and do not have in another. Maybe there is explanation and
I very want to know about it.

Thank you Borislav.

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-27 12:12               ` Alexander Kuleshov
@ 2015-05-27 12:51                 ` Borislav Petkov
  2015-05-28  8:01                   ` Alexander Kuleshov
  0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2015-05-27 12:51 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Wed, May 27, 2015 at 06:12:59PM +0600, Alexander Kuleshov wrote:
> Is it bad or we no need in it? I want to understand not only how
> kernel works, but also why it written so and I can't understand why we
> have 'earlyprintk' (or another feature) in one place and do not have
> in another.

So how hard was it to say that the first time?

That you want to be able to dump interesting parts of the early boot
process and you would like the early console working as early as
possible?

This is what I wanted to know - what is your use case. Not what is there
and what isn't there in the code. That I can figure out by browsing the
code myself. Most of the time, at least. :-)

Now, have you tested this on real hardware? Because your 0/n message
said "qemu" but I don't think that's sufficient. If we're going to
enable early_printk this early, we'd need it working on real hardware
too.

For that I'd suggest adding a 4th, test patch which issues a couple of
numbered early_printk() lines which we could run on a bunch of machines
to see whether it actually works.

Thanks.

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-27 12:51                 ` Borislav Petkov
@ 2015-05-28  8:01                   ` Alexander Kuleshov
  2015-05-29 16:55                     ` Borislav Petkov
  0 siblings, 1 reply; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-28  8:01 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

2015-05-27 18:51 GMT+06:00 Borislav Petkov <bp@suse.de>:
> Now, have you tested this on real hardware? Because your 0/n message
> said "qemu" but I don't think that's sufficient. If we're going to
> enable early_printk this early, we'd need it working on real hardware
> too.
>
> For that I'd suggest adding a 4th, test patch which issues a couple of
> numbered early_printk() lines which we could run on a bunch of machines
> to see whether it actually works.

Thank you for suggestions. But how to do it? The patch already contains:

if (console_loglevel >= CONSOLE_LOGLEVEL_DEBUG)
      early_printk("Early printk is initialized\n");

But I've just noticesed that it does not print anything, because
console_loglevel can be CONSOLE_LOGLEVEL_DEBUG
only after parse_early_params too :) How to better be with it? To remove
if clause and just leave early_printk or something else?

Or you meant something else about patch for testing?

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-28  8:01                   ` Alexander Kuleshov
@ 2015-05-29 16:55                     ` Borislav Petkov
  2015-06-02 11:25                       ` Alexander Kuleshov
  0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2015-05-29 16:55 UTC (permalink / raw)
  To: Alexander Kuleshov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

On Thu, May 28, 2015 at 02:01:12PM +0600, Alexander Kuleshov wrote:
> 2015-05-27 18:51 GMT+06:00 Borislav Petkov <bp@suse.de>:
> > Now, have you tested this on real hardware? Because your 0/n message
> > said "qemu" but I don't think that's sufficient. If we're going to
> > enable early_printk this early, we'd need it working on real hardware
> > too.
> >
> > For that I'd suggest adding a 4th, test patch which issues a couple of
> > numbered early_printk() lines which we could run on a bunch of machines
> > to see whether it actually works.
> 
> Thank you for suggestions. But how to do it? The patch already contains:
> 
> if (console_loglevel >= CONSOLE_LOGLEVEL_DEBUG)
>       early_printk("Early printk is initialized\n");

You can boot with "ignore_loglevel" to see that message. Provided
ignore_loglevel is even parsed that early.

> But I've just noticesed that it does not print anything, because
> console_loglevel can be CONSOLE_LOGLEVEL_DEBUG
> only after parse_early_params too :) How to better be with it? To remove
> if clause and just leave early_printk or something else?
> 
> Or you meant something else about patch for testing?

Yes, I meant a testing patch which is used only for testing and which
issues a bunch of early_printk() calls.

But, before you do that, your patchset has more problems. Booting in
qemu+kvm gives this:

early console in setup code
early console in decompress_kernel

Decompressing Linux... Parsing ELF... done.
Booting the kernel.
[    0.000000] bootconsole [earlyser0] enabled
[    0.000000] ERROR: earlyprintk= earlyser already used
	       ^^^^^^

[    0.000000] Linux version 4.1.0-rc5+ (boris@pd) (gcc version 4.9.2 (Debian 4.9.2-10) ) #3 SMP PREEMPT Fri May 29 18:41:59 CEST 2015
[    0.000000] Command line: root=/dev/sda1 debug ignore_loglevel log_buf_len=16M earlyprintk=ttyS0,115200 console=ttyS0,115200 console=tty0

...

[    0.000000] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] bootconsole [earlyser0] disabled
[    0.000000] bootconsole [earlyser0] enabled
[    0.000000] ERROR: earlyprintk= earlyser already used

...

[    0.000000]  per task-struct memory footprint: 2688 bytes
[    0.000000] WARNING: lockdep init error! lock-(console_sem).lock was acquiredbefore lockdep_init
[    0.000000] Call stack leading to lockdep invocation was:
[    0.000000]  [<ffffffff81013f0f>] save_stack_trace+0x2f/0x50
[    0.000000]  [<ffffffff810a364c>] __lock_acquire+0xa2c/0xf00
[    0.000000]  [<ffffffff810a440b>] lock_acquire+0xdb/0x2b0
[    0.000000]  [<ffffffff81676b33>] _raw_spin_lock_irqsave+0x53/0x90
[    0.000000]  [<ffffffff8109b146>] down+0x16/0x50
[    0.000000]  [<ffffffff810b4d49>] console_lock+0x19/0x60
[    0.000000]  [<ffffffff810b78e6>] register_console+0x116/0x350
[    0.000000]  [<ffffffff81c36162>] setup_early_printk+0x165/0x467
[    0.000000]  [<ffffffff81c364ba>] setup_early_serial_console+0x56/0x58
[    0.000000]  [<ffffffff81c24565>] x86_64_start_kernel+0xce/0x110
[    0.000000]  [<ffffffffffffffff>] 0xffffffffffffffff
[    0.000000] ------------------------

This last one shows that you'd need to look into lockdep first. It also
shows that early boot order is pretty fragile so one has to be very
careful when changing stuff there.

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

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

* Re: [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-29 16:55                     ` Borislav Petkov
@ 2015-06-02 11:25                       ` Alexander Kuleshov
  0 siblings, 0 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-06-02 11:25 UTC (permalink / raw)
  To: Borislav Petkov
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Andy Shevchenko,
	LKML, Greg Kroah-Hartman, Mark Rustad, Yinghai Lu

2015-05-29 22:55 GMT+06:00 Borislav Petkov <bp@suse.de>:
>
> You can boot with "ignore_loglevel" to see that message. Provided
> ignore_loglevel is even parsed that early.
>

But ignore_loglevel is early_param too...

>
> Yes, I meant a testing patch which is used only for testing and which
> issues a bunch of early_printk() calls.
>

Maybe I just remove 'if' clause and just leave:

early_printk("Early printk is initialized\n");

In the arch/x86/kernel/head{32,64}.c? Call of the early_printk
is safe here, even earlyprintk is not enabled and it must
be good for testing this patchset.

> But, before you do that, your patchset has more problems. Booting in
> qemu+kvm gives this:
>
> early console in setup code
> early console in decompress_kernel
>
> Decompressing Linux... Parsing ELF... done.
> Booting the kernel.
> [    0.000000] bootconsole [earlyser0] enabled
> [    0.000000] ERROR: earlyprintk= earlyser already used
>                ^^^^^^

Yes, thanks. This is because we go though a buffer in a loop
and after the earlyprintk=ttyS0, it finds console=ttyS0. So,
I think we can add additional check, something like this:

if (!strncmp(buf, "serial", 6) &&
    early_serial_console.index == -1) {
    ...
    ...
    ...
}

and for the "ttyS...". Just tested it and it works without
"ERROR: earlyprintk= earlyser already used".

>
> [    0.000000]  per task-struct memory footprint: 2688 bytes
> [    0.000000] WARNING: lockdep init error! lock-(console_sem).lock was acquiredbefore lockdep_init
> [    0.000000] Call stack leading to lockdep invocation was:
> [    0.000000]  [<ffffffff81013f0f>] save_stack_trace+0x2f/0x50
> [    0.000000]  [<ffffffff810a364c>] __lock_acquire+0xa2c/0xf00
> [    0.000000]  [<ffffffff810a440b>] lock_acquire+0xdb/0x2b0
> [    0.000000]  [<ffffffff81676b33>] _raw_spin_lock_irqsave+0x53/0x90
> [    0.000000]  [<ffffffff8109b146>] down+0x16/0x50
> [    0.000000]  [<ffffffff810b4d49>] console_lock+0x19/0x60
> [    0.000000]  [<ffffffff810b78e6>] register_console+0x116/0x350
> [    0.000000]  [<ffffffff81c36162>] setup_early_printk+0x165/0x467
> [    0.000000]  [<ffffffff81c364ba>] setup_early_serial_console+0x56/0x58
> [    0.000000]  [<ffffffff81c24565>] x86_64_start_kernel+0xce/0x110
> [    0.000000]  [<ffffffffffffffff>] 0xffffffffffffffff
> [    0.000000] ------------------------
>
> This last one shows that you'd need to look into lockdep first. It also
> shows that early boot order is pretty fragile so one has to be very
> careful when changing stuff there.
>

What if I add call of the lockdep_init before the setup_early_serial_console?
It must be safe because there is check in the lockdep_init:

if (lockdep_initialized)
    return;

and some architectures (powerpc, microblaze, s390) already do it in
the same way.

What do you think about it?

Thank you.

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

* [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible
  2015-05-18  9:19 [PATCH v7 " Alexander Kuleshov
@ 2015-05-26 13:04 ` Alexander Kuleshov
  0 siblings, 0 replies; 18+ messages in thread
From: Alexander Kuleshov @ 2015-05-26 13:04 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: Alexander Kuleshov, Andy Shevchenko, LKML, Greg Kroah-Hartman,
	Borislav Petkov, Mark Rustad, Yinghai Lu

The early_printk function is usable only after the setup_early_printk will
be executed. We pass 'earlyprintk' through the kernel command line. So, it
means that earlyprintk will be usable only after the 'parse_early_param'
will be executed. We have usable earlyprintk only during early boot, kernel
decompression and after call of the 'parse_early_param'. This patchset makes
serial earlyprintk usable before the call of the 'parse_early_param'.

Patchset was tested for both x86 and x86_64 architectures with the qemu.

These patchset provides following changes:

1. Move handling of the builtin command line to the separate function
from the setup_arch. Now we can call it from the arch/x86/kernel/head{32,64}.c,
and find 'earlyprintk' kernel command line paramter there.

2. Provide setup_serial_console function to setup serial earlyprintk in the
arch/x86/kernel/head{32,64}.c

v8:

* Fixed warning with the definition of the setup_early_serial_console
in the arch/x86/include/asm/setup.h

v7:

* Move setup_early_serial_console to the the arch/x86/include/setup.h
* Add ifdefs to prevent setup_serial_console if CONFIG_EARLY_PRINTK
is not set.

v6:

* Style fixes.
* Call of the suetp_builtin_cmdline moved to the separate patch.

v5:

* Call setup_builtin_cmdline instead of setup_cmdline

v4:

* Move setup_early_serial_console from the include/linux/printk.h
to the arch/x86/include/asm/serial.h, because this function is only
for x86 now.

v3:

* Call setup_cmdline before setup_early_printk;
* setup_early_printk call wrapped with the setup_early_serial_console which
checks that 'serial' given to the earlyprintk command line option. This
prevents call of the setup_early_printk with the given pciserial/dbgp/efi,
because they are using early_ioremap.

v2:

* Comment added before the setup_early_printk call;
* Added information about testing to the commit message.

Alexander Kuleshov (3):
  x86/setup: introduce setup_bultin_cmdline
  x86/setup: handle builtin command line as early as possible
  x86/earlyprintk: setup earlyprintk as early as possible

 arch/x86/include/asm/setup.h   |  8 ++++++++
 arch/x86/kernel/early_printk.c | 24 ++++++++++++++++++++++++
 arch/x86/kernel/head32.c       |  7 +++++++
 arch/x86/kernel/head64.c       |  7 +++++++
 arch/x86/kernel/setup.c        | 33 ++++++++++++++++++---------------
 5 files changed, 64 insertions(+), 15 deletions(-)

--
2.4.0.350.g9532ead


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

end of thread, other threads:[~2015-06-02 11:26 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-26 13:06 [PATCH v8 0/3] x86/earlyprintk: setup serial earlyprintk as early as possible Alexander Kuleshov
2015-05-26 13:07 ` [PATCH v8 1/3] x86/setup: introduce setup_bultin_cmdline Alexander Kuleshov
2015-05-26 13:07 ` [PATCH v8 2/3] x86/setup: handle builtin command line as early as possible Alexander Kuleshov
2015-05-26 13:08 ` [PATCH v8 3/3] x86/earlyprintk: setup earlyprintk " Alexander Kuleshov
2015-05-26 13:17 ` [PATCH v8 0/3] x86/earlyprintk: setup serial " Borislav Petkov
2015-05-26 13:20   ` Alexander Kuleshov
2015-05-26 13:57     ` Borislav Petkov
2015-05-26 14:11       ` Alexander Kuleshov
2015-05-26 14:58         ` Andy Shevchenko
2015-05-26 21:34         ` Borislav Petkov
2015-05-27  7:33           ` Alexander Kuleshov
2015-05-27 12:01             ` Borislav Petkov
2015-05-27 12:12               ` Alexander Kuleshov
2015-05-27 12:51                 ` Borislav Petkov
2015-05-28  8:01                   ` Alexander Kuleshov
2015-05-29 16:55                     ` Borislav Petkov
2015-06-02 11:25                       ` Alexander Kuleshov
  -- strict thread matches above, loose matches on Subject: below --
2015-05-18  9:19 [PATCH v7 " Alexander Kuleshov
2015-05-26 13:04 ` [PATCH v8 " Alexander Kuleshov

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