[PATCH v2] powerpc/fadump: set an upper limit for boot memory size
Hari Bathini
hbathini at linux.vnet.ibm.com
Wed May 17 22:10:16 AEST 2017
Hi Michael,
On Friday 24 February 2017 05:54 PM, Hari Bathini wrote:
> By default, 5% of system RAM is reserved for preserving boot memory.
> Alternatively, a user can specify the amount of memory to reserve.
> See Documentation/powerpc/firmware-assisted-dump.txt for details. In
> addition to the memory reserved for preserving boot memory, some more
> memory is reserved, to save HPTE region, CPU state data and ELF core
> headers.
>
> Memory Reservation during first kernel looks like below:
>
> Low memory Top of memory
> 0 boot memory size |
> | | |<--Reserved dump area -->|
> V V | Permanent Reservation V
> +-----------+----------/ /----------+---+----+-----------+----+
> | | |CPU|HPTE| DUMP |ELF |
> +-----------+----------/ /----------+---+----+-----------+----+
> | ^
> | |
> \ /
> -------------------------------------------
> Boot memory content gets transferred to
> reserved area by firmware at the time of
> crash
>
> This implicitly means that the sum of the sizes of boot memory, CPU
> state data, HPTE region, DUMP preserving area and ELF core headers
> can't be greater than the total memory size. But currently, a user is
> allowed to specify any value as boot memory size. So, the above rule
> is violated when a boot memory size around 50% of the total available
> memory is specified. As the kernel is not handling this currently, it
> may lead to undefined behavior. Fix it by setting an upper limit for
> boot memory size to 25% of the total available memory. Also, instead
> of using memblock_end_of_DRAM(), which doesn't take the holes, if any,
> in the memory layout into account, use memblock_phys_mem_size() to
> calculate the percentage of total available memory.
>
> Signed-off-by: Hari Bathini <hbathini at linux.vnet.ibm.com>
> ---
>
> This patch is based on top of the patchset to reuse-crashkernel-parameter-
> for-fadump (http://patchwork.ozlabs.org/patch/711522).
The above mentioned patch-set is upstream.
Can you please review this patch.
Thanks
Hari
> Changes from v1:
> * Using memblock_phys_mem_size() instead of memblock_end_of_DRAM() to
> get system RAM size.
>
>
> arch/powerpc/include/asm/fadump.h | 3 +++
> arch/powerpc/kernel/fadump.c | 16 +++++++++++++++-
> 2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h
> index 60b9108..a3de219 100644
> --- a/arch/powerpc/include/asm/fadump.h
> +++ b/arch/powerpc/include/asm/fadump.h
> @@ -43,6 +43,9 @@
> #define MIN_BOOT_MEM (((RMA_END < (0x1UL << 28)) ? (0x1UL << 28) : RMA_END) \
> + (0x1UL << 26))
>
> +/* The upper limit percentage for user specified boot memory size (25%) */
> +#define MAX_BOOT_MEM_RATIO 4
> +
> #define memblock_num_regions(memblock_type) (memblock.memblock_type.cnt)
>
> /* Firmware provided dump sections */
> diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c
> index e013f8f..21d5404 100644
> --- a/arch/powerpc/kernel/fadump.c
> +++ b/arch/powerpc/kernel/fadump.c
> @@ -221,12 +221,26 @@ static inline unsigned long fadump_calculate_reserve_size(void)
> ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
> &size, &base);
> if (ret == 0 && size > 0) {
> + unsigned long max_size;
> +
> fw_dump.reserve_bootvar = (unsigned long)size;
> +
> + /*
> + * Adjust if the boot memory size specified is above
> + * the upper limit.
> + */
> + max_size = memblock_phys_mem_size() / MAX_BOOT_MEM_RATIO;
> + if (fw_dump.reserve_bootvar > max_size) {
> + fw_dump.reserve_bootvar = max_size;
> + pr_info("Adjusted boot memory size to %luMB\n",
> + (fw_dump.reserve_bootvar >> 20));
> + }
> +
> return fw_dump.reserve_bootvar;
> }
>
> /* divide by 20 to get 5% of value */
> - size = memblock_end_of_DRAM() / 20;
> + size = memblock_phys_mem_size() / 20;
>
> /* round it down in multiples of 256 */
> size = size & ~0x0FFFFFFFUL;
>
More information about the Linuxppc-dev
mailing list