Factor out the crash memory range collection logic from
crash_prepare_headers() into a separate function. This allows
the memory hotplug path to obtain and modify the range list
(e.g. remove offlined memory) before generating the elfcorehdr.

Cc: Andrew Morton <[email protected]>
Cc: Baoquan He <[email protected]>
Cc: Mike Rapoport <[email protected]>
Cc: Pasha Tatashin <[email protected]>
Cc: Pratyush Yadav <[email protected]>
Cc: Dave Young <[email protected]>
Signed-off-by: Jinjie Ruan <[email protected]>
---
 include/linux/crash_core.h |  1 +
 kernel/crash_core.c        | 22 +++++++++++++++++++---
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h
index bc087124cd78..619af312bd9a 100644
--- a/include/linux/crash_core.h
+++ b/include/linux/crash_core.h
@@ -62,6 +62,7 @@ extern int crash_prepare_elf64_headers(struct crash_mem *mem, 
int need_kernel_ma
 extern int crash_prepare_headers(int need_kernel_map, void **addr,
                                 unsigned long *sz, unsigned long 
*nr_mem_ranges);
 extern int crash_exclude_core_ranges(struct crash_mem **cmem);
+extern int crash_get_memory_ranges(struct crash_mem **mem_ranges);
 
 struct kimage;
 struct kexec_segment;
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index d0bd2d0cf899..991d1599cf9a 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -317,8 +317,7 @@ int crash_exclude_core_ranges(struct crash_mem **cmem)
        return 0;
 }
 
-int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
-                         unsigned long *nr_mem_ranges)
+int crash_get_memory_ranges(struct crash_mem **mem_ranges)
 {
        unsigned int max_nr_ranges;
        struct crash_mem *cmem;
@@ -344,13 +343,30 @@ int crash_prepare_headers(int need_kernel_map, void 
**addr, unsigned long *sz,
        if (ret)
                goto out;
 
+       *mem_ranges = cmem;
+       return 0;
+
+out:
+       kvfree(cmem);
+       return ret;
+}
+
+int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+                         unsigned long *nr_mem_ranges)
+{
+       struct crash_mem *cmem = NULL;
+       int ret;
+
+       ret = crash_get_memory_ranges(&cmem);
+       if (ret)
+               return ret;
+
        /* Return the computed number of memory ranges, for hotplug usage */
        if (nr_mem_ranges)
                *nr_mem_ranges = cmem->nr_ranges;
 
        ret = crash_prepare_elf64_headers(cmem, need_kernel_map, addr, sz);
 
-out:
        kvfree(cmem);
        return ret;
 }
-- 
2.34.1


Reply via email to