Commit eae0dfcc authored by Hari Bathini's avatar Hari Bathini Committed by Michael Ellerman
Browse files

powerpc/fadump: avoid holes in boot memory area when fadump is registered



To register fadump, boot memory area - the size of low memory chunk that
is required for a kernel to boot successfully when booted with restricted
memory, is assumed to have no holes. But this memory area is currently
not protected from hot-remove operations. So, fadump could fail to
re-register after a memory hot-remove operation, if memory is removed
from boot memory area. To avoid this, ensure that memory from boot
memory area is not hot-removed when fadump is registered.

Signed-off-by: default avatarHari Bathini <hbathini@linux.vnet.ibm.com>
Reviewed-by: default avatarMahesh J Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent a77af552
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -203,6 +203,7 @@ struct fad_crash_memory_ranges {
	unsigned long long	size;
};

extern int is_fadump_boot_memory_area(u64 addr, ulong size);
extern int early_init_dt_scan_fw_dump(unsigned long node,
		const char *uname, int depth, void *data);
extern int fadump_reserve_mem(void);
+12 −0
Original line number Diff line number Diff line
@@ -113,6 +113,18 @@ int __init early_init_dt_scan_fw_dump(unsigned long node,
	return 1;
}

/*
 * If fadump is registered, check if the memory provided
 * falls within boot memory area.
 */
int is_fadump_boot_memory_area(u64 addr, ulong size)
{
	if (!fw_dump.dump_registered)
		return 0;

	return (addr + size) > RMA_START && addr <= fw_dump.boot_memory_size;
}

int is_fadump_active(void)
{
	return fw_dump.dump_active;
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <asm/machdep.h>
#include <asm/prom.h>
#include <asm/sparsemem.h>
#include <asm/fadump.h>
#include "pseries.h"

static bool rtas_hp_event;
@@ -406,6 +407,12 @@ static bool lmb_is_removable(struct of_drconf_cell *lmb)
	scns_per_block = block_sz / MIN_MEMORY_BLOCK_SIZE;
	phys_addr = lmb->base_addr;

#ifdef CONFIG_FA_DUMP
	/* Don't hot-remove memory that falls in fadump boot memory area */
	if (is_fadump_boot_memory_area(phys_addr, block_sz))
		return false;
#endif

	for (i = 0; i < scns_per_block; i++) {
		pfn = PFN_DOWN(phys_addr);
		if (!pfn_present(pfn))