]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/boot: Add bootdebug option to control debug messages
authorVasily Gorbik <gor@linux.ibm.com>
Wed, 20 Nov 2024 21:23:48 +0000 (22:23 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 26 Jan 2025 16:24:01 +0000 (17:24 +0100)
Suppress decompressor debug messages by default, similar to regular
kernel debug messages that require 'DEBUG' or 'dyndbg' to be enabled
(depending on CONFIG_DYNAMIC_DEBUG). Introduce a 'bootdebug' option to
enable printing these messages when needed.

All messages are still stored in the boot ring buffer regardless.

To enable boot debug messages:

  bootdebug debug

Or combine with 'earlyprintk' to print them without delay:

  bootdebug debug earlyprintk

Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/boot/ipl_parm.c
arch/s390/boot/printk.c
arch/s390/include/asm/boot_data.h
arch/s390/kernel/early.c
arch/s390/kernel/setup.c

index fd4874ab30cb7c5dd6867e6218cb01fb03e48c24..397046f0c1dfeaec75cead45765b491d7c5e9d23 100644 (file)
@@ -317,6 +317,8 @@ void parse_boot_command_line(void)
                        boot_earlyprintk = true;
                if (!strcmp(param, "debug"))
                        boot_console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
+               if (!strcmp(param, "bootdebug"))
+                       bootdebug = true;
                if (!strcmp(param, "quiet"))
                        boot_console_loglevel = CONSOLE_LOGLEVEL_QUIET;
                if (!strcmp(param, "ignore_loglevel"))
index 7b7203f078c806aaa7564d4b4804f68ca6c7dc29..4c60245697ab00b9c9d55a267cc205e7bd2ad089 100644 (file)
@@ -17,6 +17,7 @@ bool boot_ignore_loglevel;
 char __bootdata(boot_rb)[PAGE_SIZE * 2];
 bool __bootdata(boot_earlyprintk);
 size_t __bootdata(boot_rb_off);
+bool __bootdata(bootdebug);
 
 static void boot_rb_add(const char *str, size_t len)
 {
@@ -168,6 +169,9 @@ static void boot_console_earlyprintk(const char *buf)
        /* always print emergency messages */
        if (level > LOGLEVEL_EMERG && !boot_earlyprintk)
                return;
+       /* print debug messages only when bootdebug is enabled */
+       if (level == LOGLEVEL_DEBUG && !bootdebug)
+               return;
        if (boot_ignore_loglevel || level < boot_console_loglevel)
                sclp_early_printk(printk_skip_level(buf));
 }
index e7ef7524b847e299293c9ed8723c5f1ece50ef90..da5527c50738e8a911ab4c85ccaa846ea3272c4b 100644 (file)
@@ -18,6 +18,7 @@ extern unsigned long early_ipl_comp_list_size;
 extern char boot_rb[PAGE_SIZE * 2];
 extern bool boot_earlyprintk;
 extern size_t boot_rb_off;
+extern bool bootdebug;
 
 #define boot_rb_foreach(cb)                                                    \
        do {                                                                    \
index 62f8f5a750a308a587e2a20ffd75ad368c8da696..4cdf3bf33052ea77f96f182648b158b942fcdea8 100644 (file)
@@ -50,6 +50,7 @@ decompressor_handled_param(facilities);
 decompressor_handled_param(nokaslr);
 decompressor_handled_param(cmma);
 decompressor_handled_param(relocate_lowcore);
+decompressor_handled_param(bootdebug);
 #if IS_ENABLED(CONFIG_KVM)
 decompressor_handled_param(prot_virt);
 #endif
index feff1bb9ac2da67ab235d15c47e6b6c2a62ce3fb..dd0979182890e131d46c290f926b2111a8aad205 100644 (file)
@@ -160,6 +160,7 @@ struct oldmem_data __bootdata_preserved(oldmem_data);
 char __bootdata(boot_rb)[PAGE_SIZE * 2];
 bool __bootdata(boot_earlyprintk);
 size_t __bootdata(boot_rb_off);
+bool __bootdata(bootdebug);
 
 unsigned long __bootdata_preserved(VMALLOC_START);
 EXPORT_SYMBOL(VMALLOC_START);
@@ -882,13 +883,18 @@ static void __init log_component_list(void)
 }
 
 /*
- * Print avoiding interpretation of % in buf
+ * Print avoiding interpretation of % in buf and taking bootdebug option
+ * into consideration.
  */
 static void __init print_rb_entry(char *buf)
 {
        char fmt[] = KERN_SOH "0boot: %s";
+       int level = printk_get_level(buf);
 
-       fmt[1] = printk_get_level(buf);
+       if (level == KERN_DEBUG[1] && !bootdebug)
+               return;
+
+       fmt[1] = level;
        printk(fmt, printk_skip_level(buf));
 }