[PATCH v3 04/12] ppc64/kexec_file: avoid stomping memory used by special regions
Thiago Jung Bauermann
bauerman at linux.ibm.com
Thu Jul 16 01:58:04 EDT 2020
Thiago Jung Bauermann <bauerman at linux.ibm.com> writes:
> Hari Bathini <hbathini at linux.ibm.com> writes:
>
>> diff --git a/arch/powerpc/include/asm/crashdump-ppc64.h b/arch/powerpc/include/asm/crashdump-ppc64.h
>> new file mode 100644
>> index 0000000..90deb46
>> --- /dev/null
>> +++ b/arch/powerpc/include/asm/crashdump-ppc64.h
>> @@ -0,0 +1,10 @@
>> +/* SPDX-License-Identifier: GPL-2.0-only */
>> +#ifndef _ASM_POWERPC_CRASHDUMP_PPC64_H
>> +#define _ASM_POWERPC_CRASHDUMP_PPC64_H
>> +
>> +/* min & max addresses for kdump load segments */
>> +#define KDUMP_BUF_MIN (crashk_res.start)
>> +#define KDUMP_BUF_MAX ((crashk_res.end < ppc64_rma_size) ? \
>> + crashk_res.end : (ppc64_rma_size - 1))
>> +
>> +#endif /* __ASM_POWERPC_CRASHDUMP_PPC64_H */
>> diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
>> index 7008ea1..bf47a01 100644
>> --- a/arch/powerpc/include/asm/kexec.h
>> +++ b/arch/powerpc/include/asm/kexec.h
>> @@ -100,14 +100,16 @@ void relocate_new_kernel(unsigned long indirection_page, unsigned long reboot_co
>> #ifdef CONFIG_KEXEC_FILE
>> extern const struct kexec_file_ops kexec_elf64_ops;
>>
>> -#ifdef CONFIG_IMA_KEXEC
>> #define ARCH_HAS_KIMAGE_ARCH
>>
>> struct kimage_arch {
>> + struct crash_mem *exclude_ranges;
>> +
>> +#ifdef CONFIG_IMA_KEXEC
>> phys_addr_t ima_buffer_addr;
>> size_t ima_buffer_size;
>> -};
>> #endif
>> +};
>>
>> int setup_purgatory(struct kimage *image, const void *slave_code,
>> const void *fdt, unsigned long kernel_load_addr,
>> @@ -125,6 +127,7 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
>> unsigned long initrd_load_addr,
>> unsigned long initrd_len, const char *cmdline);
>> #endif /* CONFIG_PPC64 */
>> +
>> #endif /* CONFIG_KEXEC_FILE */
>>
>> #else /* !CONFIG_KEXEC_CORE */
>> diff --git a/arch/powerpc/kexec/elf_64.c b/arch/powerpc/kexec/elf_64.c
>> index 23ad04c..c695f94 100644
>> --- a/arch/powerpc/kexec/elf_64.c
>> +++ b/arch/powerpc/kexec/elf_64.c
>> @@ -22,6 +22,7 @@
>> #include <linux/of_fdt.h>
>> #include <linux/slab.h>
>> #include <linux/types.h>
>> +#include <asm/crashdump-ppc64.h>
>>
>> static void *elf64_load(struct kimage *image, char *kernel_buf,
>> unsigned long kernel_len, char *initrd,
>> @@ -46,6 +47,12 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
>> if (ret)
>> goto out;
>>
>> + if (image->type == KEXEC_TYPE_CRASH) {
>> + /* min & max buffer values for kdump case */
>> + kbuf.buf_min = pbuf.buf_min = KDUMP_BUF_MIN;
>> + kbuf.buf_max = pbuf.buf_max = KDUMP_BUF_MAX;
>
> This is only my personal opinion and an actual maintainer may disagree,
> but just looking at the lines above, I would assume that KDUMP_BUF_MIN
> and KDUMP_BUF_MAX were constants, when in fact they aren't.
>
> I suggest using static inline macros in <asm/crashdump-ppc64.h>, for
> example:
>
> static inline resource_size_t get_kdump_buf_min(void)
> {
> return crashk_res.start;
> }
>
> static inline resource_size_t get_kdump_buf_max(void)
> {
> return (crashk_res.end < ppc64_rma_size) ? \
> crashk_res.end : (ppc64_rma_size - 1)
> }
I later noticed that KDUMP_BUF_MIN and KDUMP_BUF_MAX are only used here.
In this case, I think the best option is to avoid the macros and inline
functions and just use the actual expressions in the code.
--
Thiago Jung Bauermann
IBM Linux Technology Center
More information about the kexec
mailing list