Re: [PATCH v7 3/5] crash: Use crash_exclude_core_ranges() on powerpc

Sourabh Jain
2026-02-28T13:09:31Z

On 28/02/26 06:51, Jinjie Ruan wrote:
>
> On 2026/2/27 22:50, Sourabh Jain wrote:
>> Resend of:
>> https://lore.kernel.org/all/19cf18b5-362d-4ff2-8b85-e2e72809250c@linux.ibm.com/
>>
>> On 26/02/26 18:34, Jinjie Ruan wrote:
>>> The crash memory exclude of crashk_res and crashk_cma memory on powerpc
>>> are almost identical to the generic crash_exclude_core_ranges().
>>>
>>> By introducing the architecture-specific arch_crash_exclude_mem_range()
>>> function with a default implementation of crash_exclude_mem_range(),
>>> and using crash_exclude_mem_range_guarded as powerpc's separate
>>> implementation, the generic crash_exclude_core_ranges() helper function
>>> can be reused.
>>>
>>> Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
>>> Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
>>> ---
>>>   arch/powerpc/kexec/ranges.c | 16 ++++------------
>>>   include/linux/crash_core.h  |  4 ++++
>>>   kernel/crash_core.c         | 19 +++++++++++++------
>>>   3 files changed, 21 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/arch/powerpc/kexec/ranges.c b/arch/powerpc/kexec/ranges.c
>>> index 6c58bcc3e130..e5fea23b191b 100644
>>> --- a/arch/powerpc/kexec/ranges.c
>>> +++ b/arch/powerpc/kexec/ranges.c
>>> @@ -553,9 +553,9 @@ int get_usable_memory_ranges(struct crash_mem
>>> **mem_ranges)
>>>   #endif /* CONFIG_KEXEC_FILE */
>>>     #ifdef CONFIG_CRASH_DUMP
>>> -int crash_exclude_mem_range_guarded(struct crash_mem **mem_ranges,
>>> -                       unsigned long long mstart,
>>> -                       unsigned long long mend)
>>> +int arch_crash_exclude_mem_range(struct crash_mem **mem_ranges,
>>> +                 unsigned long long mstart,
>>> +                 unsigned long long mend)
>>
>> update_crash_elfcorehdr() in arch/powerpc/kexec/crash.c still calls
>> crash_exclude_mem_range_guarded(), causing a build failure.
>>
>> ld: arch/powerpc/kexec/crash.o: in function `update_crash_elfcorehdr':
>> /root/linux/arch/powerpc/kexec/crash.c:454: undefined reference to
>> `crash_exclude_mem_range_guarded'
>>
>>
>> To fix this:
>> --------------
>> diff --git a/arch/powerpc/kexec/crash.c b/arch/powerpc/kexec/crash.c
>> index 898742a5205c..e59e909c369d 100644
>> --- a/arch/powerpc/kexec/crash.c
>> +++ b/arch/powerpc/kexec/crash.c
>> @@ -451,7 +451,7 @@ static void update_crash_elfcorehdr(struct kimage
>> *image, struct memory_notify *
>>                 base_addr = PFN_PHYS(mn->start_pfn);
>>                 size = mn->nr_pages * PAGE_SIZE;
>>                 end = base_addr + size - 1;
>> -               ret = crash_exclude_mem_range_guarded(&cmem, base_addr,
>> end);
>> +              ret = arch_crash_exclude_mem_range(&cmem, base_addr, end);
>>                 if (ret) {
>>                         pr_err("Failed to remove hot-unplugged memory
>> from crash memory ranges\n");
>>                         goto out;
>>
>> With the above change included, things are working fine on powerpc.
> It seems the declaration of crash_exclude_mem_range_guarded() added in
> arch/powerpc/include/asm/kexec_ranges.h can also be removed.

Yes, lets remove it.

>
>>
>>>   {
>>>       struct crash_mem *tmem = *mem_ranges;
>>>   @@ -604,18 +604,10 @@ int get_crash_memory_ranges(struct crash_mem
>>> **mem_ranges)
>>>               sort_memory_ranges(*mem_ranges, true);
>>>       }
>>>   -    /* Exclude crashkernel region */
>>> -    ret = crash_exclude_mem_range_guarded(mem_ranges,
>>> crashk_res.start, crashk_res.end);
>>> +    ret = crash_exclude_core_ranges(mem_ranges);
>>>       if (ret)
>>>           goto out;
>>>   -    for (i = 0; i < crashk_cma_cnt; ++i) {
>>> -        ret = crash_exclude_mem_range_guarded(mem_ranges,
>>> crashk_cma_ranges[i].start,
>>> -                          crashk_cma_ranges[i].end);
>>> -        if (ret)
>>> -            goto out;
>>> -    }
>>> -
>>>       /*
>>>        * FIXME: For now, stay in parity with kexec-tools but if RTAS/OPAL
>>>        *        regions are exported to save their context at the time of
>>> diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h
>>> index 033b20204aca..dbec826dc53b 100644
>>> --- a/include/linux/crash_core.h
>>> +++ b/include/linux/crash_core.h
>>> @@ -68,6 +68,7 @@ extern int crash_prepare_elf64_headers(struct
>>> crash_mem *mem, int need_kernel_ma
>>>                          void **addr, unsigned long *sz);
>>>   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);
>>>     struct kimage;
>>>   struct kexec_segment;
>>> @@ -88,6 +89,9 @@ extern int kimage_crash_copy_vmcoreinfo(struct
>>> kimage *image);
>>>   extern unsigned int arch_get_system_nr_ranges(void);
>>>   extern int arch_crash_populate_cmem(struct crash_mem *cmem);
>>>   extern int arch_crash_exclude_ranges(struct crash_mem *cmem);
>>> +extern int arch_crash_exclude_mem_range(struct crash_mem **mem,
>>> +                    unsigned long long mstart,
>>> +                    unsigned long long mend);
>>>     #else /* !CONFIG_CRASH_DUMP*/
>>>   struct pt_regs;
>>> diff --git a/kernel/crash_core.c b/kernel/crash_core.c
>>> index 96a96e511f5a..300d44ad5471 100644
>>> --- a/kernel/crash_core.c
>>> +++ b/kernel/crash_core.c
>>> @@ -287,24 +287,31 @@ unsigned int __weak
>>> arch_get_system_nr_ranges(void) { return 0; }
>>>   int __weak arch_crash_populate_cmem(struct crash_mem *cmem) { return
>>> -1; }
>>>   int __weak arch_crash_exclude_ranges(struct crash_mem *cmem) {
>>> return 0; }
>>>   -static int crash_exclude_core_ranges(struct crash_mem *cmem)
>>> +int __weak arch_crash_exclude_mem_range(struct crash_mem **mem,
>>> +                    unsigned long long mstart,
>>> +                    unsigned long long mend)
>>> +{
>>> +    return crash_exclude_mem_range(*mem, mstart, mend);
>>> +}
>>> +
>>> +int crash_exclude_core_ranges(struct crash_mem **cmem)
>>>   {
>>>       int ret, i;
>>>         /* Exclude crashkernel region */
>>> -    ret = crash_exclude_mem_range(cmem, crashk_res.start,
>>> crashk_res.end);
>>> +    ret = arch_crash_exclude_mem_range(cmem, crashk_res.start,
>>> crashk_res.end);
>>>       if (ret)
>>>           return ret;
>>>         if (crashk_low_res.end) {
>>> -        ret = crash_exclude_mem_range(cmem, crashk_low_res.start,
>>> crashk_low_res.end);
>>> +        ret = arch_crash_exclude_mem_range(cmem,
>>> crashk_low_res.start, crashk_low_res.end);
>>>           if (ret)
>>>               return ret;
>>>       }
>>>         for (i = 0; i < crashk_cma_cnt; ++i) {
>>> -        ret = crash_exclude_mem_range(cmem, crashk_cma_ranges[i].start,
>>> -                          crashk_cma_ranges[i].end);
>>> +        ret = arch_crash_exclude_mem_range(cmem,
>>> crashk_cma_ranges[i].start,
>>> +                           crashk_cma_ranges[i].end);
>>>           if (ret)
>>>               return ret;
>>>       }
>>> @@ -331,7 +338,7 @@ int crash_prepare_headers(int need_kernel_map,
>>> void **addr, unsigned long *sz,
>>>       if (ret)
>>>           goto out;
>>>   -    ret = crash_exclude_core_ranges(cmem);
>>> +    ret = crash_exclude_core_ranges(&cmem);
>>>       if (ret)
>>>           goto out;
>>>