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

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

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.
> 
> Acked-by: Catalin Marinas <[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/arm64/kernel/machine_kexec_file.c | 40 ++++++++------------------
>  1 file changed, 12 insertions(+), 28 deletions(-)
> 
> diff --git a/arch/arm64/kernel/machine_kexec_file.c 
> b/arch/arm64/kernel/machine_kexec_file.c
> index e31fabed378a..b019b31df48c 100644
> --- a/arch/arm64/kernel/machine_kexec_file.c
> +++ b/arch/arm64/kernel/machine_kexec_file.c
> @@ -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;


Reply via email to