| From: Sourabh Jain <sourabhjain@linux.ibm.com> |
| Subject: crash: let arch decide usable memory range in reserved area |
| Date: Fri, 31 Jan 2025 17:08:26 +0530 |
| |
| Although the crashkernel area is reserved, on architectures like PowerPC, |
| it is possible for the crashkernel reserved area to contain components |
| like RTAS, TCE, OPAL, etc. To avoid placing kexec segments over these |
| components, PowerPC has its own set of APIs to locate holes in the |
| crashkernel reserved area. |
| |
| Add an arch hook in the generic locate mem hole APIs so that architectures |
| can handle such special regions in the crashkernel area while locating |
| memory holes for kexec segments using generic APIs. With this, a lot of |
| redundant arch-specific code can be removed, as it performs the exact same |
| job as the generic APIs. |
| |
| To keep the generic and arch-specific changes separate, the changes |
| related to moving PowerPC to use the generic APIs and the removal of |
| PowerPC-specific APIs for memory hole allocation are done in a subsequent |
| patch titled "powerpc/crash: Use generic APIs to locate memory hole for |
| kdump. |
| |
| Link: https://lkml.kernel.org/r/20250131113830.925179-4-sourabhjain@linux.ibm.com |
| Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com> |
| Acked-by: Baoquan He <bhe@redhat.com> |
| Cc: Hari Bathini <hbathini@linux.ibm.com> |
| Cc: Madhavan Srinivasan <maddy@linux.ibm.com> |
| Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com> |
| Cc: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/kexec.h | 9 +++++++++ |
| kernel/kexec_file.c | 12 ++++++++++++ |
| 2 files changed, 21 insertions(+) |
| |
| --- a/include/linux/kexec.h~crash-let-arch-decide-usable-memory-range-in-reserved-area |
| +++ a/include/linux/kexec.h |
| @@ -205,6 +205,15 @@ static inline int arch_kimage_file_post_ |
| } |
| #endif |
| |
| +#ifndef arch_check_excluded_range |
| +static inline int arch_check_excluded_range(struct kimage *image, |
| + unsigned long start, |
| + unsigned long end) |
| +{ |
| + return 0; |
| +} |
| +#endif |
| + |
| #ifdef CONFIG_KEXEC_SIG |
| #ifdef CONFIG_SIGNED_PE_FILE_VERIFICATION |
| int kexec_kernel_verify_pe_sig(const char *kernel, unsigned long kernel_len); |
| --- a/kernel/kexec_file.c~crash-let-arch-decide-usable-memory-range-in-reserved-area |
| +++ a/kernel/kexec_file.c |
| @@ -464,6 +464,12 @@ static int locate_mem_hole_top_down(unsi |
| continue; |
| } |
| |
| + /* Make sure this does not conflict with exclude range */ |
| + if (arch_check_excluded_range(image, temp_start, temp_end)) { |
| + temp_start = temp_start - PAGE_SIZE; |
| + continue; |
| + } |
| + |
| /* We found a suitable memory range */ |
| break; |
| } while (1); |
| @@ -497,6 +503,12 @@ static int locate_mem_hole_bottom_up(uns |
| temp_start = temp_start + PAGE_SIZE; |
| continue; |
| } |
| + |
| + /* Make sure this does not conflict with exclude range */ |
| + if (arch_check_excluded_range(image, temp_start, temp_end)) { |
| + temp_start = temp_start + PAGE_SIZE; |
| + continue; |
| + } |
| |
| /* We found a suitable memory range */ |
| break; |
| _ |