On 6/8/2026 3:34 PM, Jinjie Ruan wrote:
> 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.
> 
> Cc: Huacai Chen <[email protected]>
> Cc: WANG Xuerui <[email protected]>
> Cc: Youling Tang <[email protected]>
> Cc: Baoquan He <[email protected]>
> Reviewed-by: Sourabh Jain <[email protected]>
> Acked-by: Baoquan He <[email protected]>
> Acked-by: Mike Rapoport (Microsoft) <[email protected]>
> Signed-off-by: Jinjie Ruan <[email protected]>
> ---
>  arch/loongarch/kernel/machine_kexec_file.c | 40 +++++++---------------
>  1 file changed, 12 insertions(+), 28 deletions(-)


The below AI reported TOCTOU bug is an existing artifact and completely
unrelated to the rework here. Therefore, we will skip fixing it in this
series to avoid unnecessary noise.

Link:
https://lore.kernel.org/all/[email protected]/

> 
> diff --git a/arch/loongarch/kernel/machine_kexec_file.c 
> b/arch/loongarch/kernel/machine_kexec_file.c
> index 5584b798ba46..5412aa9f3568 100644
> --- a/arch/loongarch/kernel/machine_kexec_file.c
> +++ b/arch/loongarch/kernel/machine_kexec_file.c
> @@ -56,46 +56,30 @@ static void cmdline_add_initrd(struct kimage *image, 
> unsigned long *cmdline_tmpl
>  }
>  
>  #ifdef CONFIG_CRASH_DUMP
> -
> -static int prepare_elf_headers(void **addr, unsigned long *sz)
> +unsigned int arch_get_system_nr_ranges(void)
>  {
> -     int ret, nr_ranges;
> -     uint64_t i;
> +     int nr_ranges = 2; /* for exclusion of crashkernel region */
>       phys_addr_t start, end;
> -     struct crash_mem *cmem;
> +     uint64_t 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;
> +     uint64_t 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 < 0)
> -             goto out;
> -
> -     if (crashk_low_res.end) {
> -             ret = crash_exclude_mem_range(cmem, crashk_low_res.start, 
> crashk_low_res.end);
> -             if (ret < 0)
> -                     goto out;
> -     }
> -
> -     ret = crash_prepare_elf64_headers(cmem, true, addr, sz);
> -
> -out:
> -     kfree(cmem);
> -     return ret;
> +     return 0;
>  }
>  
>  /*
> @@ -163,7 +147,7 @@ int load_other_segments(struct kimage *image,
>               void *headers;
>               unsigned long headers_sz;
>  
> -             ret = prepare_elf_headers(&headers, &headers_sz);
> +             ret = crash_prepare_headers(true, &headers, &headers_sz, NULL);
>               if (ret < 0) {
>                       pr_err("Preparing elf core header failed\n");
>                       goto out_err;


Reply via email to