mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
arm64: kexec_file: Use crash_prepare_headers() helper to simplify code
Use the newly introduced crash_prepare_headers() function to replace the existing prepare_elf_headers(), allocate cmem and exclude crash kernel memory in the crash core, which reduce code duplication. Only the following two architecture functions need to be implemented: - arch_get_system_nr_ranges(). Use for_each_mem_range() to traverse and pre-count the max number of memory ranges. - arch_crash_populate_cmem(). Use for_each_mem_range to traverse and collect the memory ranges and fills them into cmem. Acked-by: Catalin Marinas <catalin.marinas@arm.com> Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com> Acked-by: Baoquan He <bhe@redhat.com> Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> Link: https://patch.msgid.link/20260629094746.191843-5-ruanjinjie@huawei.com Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
This commit is contained in:
parent
5beabef0cf
commit
201b561cbc
|
|
@ -40,46 +40,30 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
static int prepare_elf_headers(void **addr, unsigned long *sz)
|
||||
unsigned int arch_get_system_nr_ranges(void)
|
||||
{
|
||||
struct crash_mem *cmem;
|
||||
unsigned int nr_ranges;
|
||||
int ret;
|
||||
u64 i;
|
||||
unsigned int nr_ranges = 2; /* for exclusion of crashkernel region */
|
||||
phys_addr_t start, end;
|
||||
u64 i;
|
||||
|
||||
nr_ranges = 2; /* for exclusion of crashkernel region */
|
||||
for_each_mem_range(i, &start, &end)
|
||||
nr_ranges++;
|
||||
|
||||
cmem = kmalloc_flex(*cmem, ranges, nr_ranges);
|
||||
if (!cmem)
|
||||
return -ENOMEM;
|
||||
return nr_ranges;
|
||||
}
|
||||
|
||||
int arch_crash_populate_cmem(struct crash_mem *cmem)
|
||||
{
|
||||
phys_addr_t start, end;
|
||||
u64 i;
|
||||
|
||||
cmem->max_nr_ranges = nr_ranges;
|
||||
cmem->nr_ranges = 0;
|
||||
for_each_mem_range(i, &start, &end) {
|
||||
cmem->ranges[cmem->nr_ranges].start = start;
|
||||
cmem->ranges[cmem->nr_ranges].end = end - 1;
|
||||
cmem->nr_ranges++;
|
||||
}
|
||||
|
||||
/* Exclude crashkernel region */
|
||||
ret = crash_exclude_mem_range(cmem, crashk_res.start, crashk_res.end);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (crashk_low_res.end) {
|
||||
ret = crash_exclude_mem_range(cmem, crashk_low_res.start, crashk_low_res.end);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = crash_prepare_elf64_headers(cmem, true, addr, sz);
|
||||
|
||||
out:
|
||||
kfree(cmem);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -109,7 +93,7 @@ int load_other_segments(struct kimage *image,
|
|||
void *headers;
|
||||
unsigned long headers_sz;
|
||||
if (image->type == KEXEC_TYPE_CRASH) {
|
||||
ret = prepare_elf_headers(&headers, &headers_sz);
|
||||
ret = crash_prepare_headers(true, &headers, &headers_sz, NULL);
|
||||
if (ret) {
|
||||
pr_err("Preparing elf core header failed\n");
|
||||
goto out_err;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user