]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crash_core: change parse_crashkernel() to support crashkernel=,high|low parsing
authorBaoquan He <bhe@redhat.com>
Thu, 14 Sep 2023 03:31:36 +0000 (11:31 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 4 Oct 2023 17:41:58 +0000 (10:41 -0700)
Now parse_crashkernel() is a real entry point for all kinds of crahskernel
parsing on any architecture.

And wrap the crahskernel=,high|low handling inside
CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION ifdeffery scope.

Link: https://lkml.kernel.org/r/20230914033142.676708-4-bhe@redhat.com
Signed-off-by: Baoquan He <bhe@redhat.com>
Reviewed-by: Zhen Lei <thunder.leizhen@huawei.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Chen Jiahao <chenjiahao16@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/crash_core.h
kernel/crash_core.c

index 6156355ef831793854078e1f2e72533e8e6ac65f..d8050a7eab0168ce3df2c5755b4170257f03fa89 100644 (file)
@@ -79,6 +79,12 @@ Elf_Word *append_elf_note(Elf_Word *buf, char *name, unsigned int type,
                          void *data, size_t data_len);
 void final_note(Elf_Word *buf);
 
+#ifdef CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
+#ifndef DEFAULT_CRASH_KERNEL_LOW_SIZE
+#define DEFAULT_CRASH_KERNEL_LOW_SIZE  (128UL << 20)
+#endif
+#endif
+
 int __init parse_crashkernel(char *cmdline, unsigned long long system_ram,
                unsigned long long *crash_size, unsigned long long *crash_base,
                unsigned long long *low_size, bool *high);
index 33ced5b5ed4e44743a1e8b38d5336d4faa014f99..99a243540a35f9ca4c4c26e7d8c217789cf2bcd5 100644 (file)
@@ -283,6 +283,9 @@ static int __init __parse_crashkernel(char *cmdline,
 /*
  * That function is the entry point for command line parsing and should be
  * called from the arch-specific code.
+ *
+ * If crashkernel=,high|low is supported on architecture, non-NULL values
+ * should be passed to parameters 'low_size' and 'high'.
  */
 int __init parse_crashkernel(char *cmdline,
                             unsigned long long system_ram,
@@ -296,10 +299,37 @@ int __init parse_crashkernel(char *cmdline,
        /* crashkernel=X[@offset] */
        ret = __parse_crashkernel(cmdline, system_ram, crash_size,
                                crash_base, NULL);
-       if (!high)
-               return ret;
+#ifdef CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
+       /*
+        * If non-NULL 'high' passed in and no normal crashkernel
+        * setting detected, try parsing crashkernel=,high|low.
+        */
+       if (high && ret == -ENOENT) {
+               ret = __parse_crashkernel(cmdline, 0, crash_size,
+                               crash_base, suffix_tbl[SUFFIX_HIGH]);
+               if (ret || !*crash_size)
+                       return -EINVAL;
 
-       return 0;
+               /*
+                * crashkernel=Y,low can be specified or not, but invalid value
+                * is not allowed.
+                */
+               ret = __parse_crashkernel(cmdline, 0, low_size,
+                               crash_base, suffix_tbl[SUFFIX_LOW]);
+               if (ret == -ENOENT) {
+                       *low_size = DEFAULT_CRASH_KERNEL_LOW_SIZE;
+                       ret = 0;
+               } else if (ret) {
+                       return ret;
+               }
+
+               *high = true;
+       }
+#endif
+       if (!*crash_size)
+               ret = -EINVAL;
+
+       return ret;
 }
 
 int __init parse_crashkernel_high(char *cmdline,