| From 082d905afbbf8bfee861c933afe8b6763ebc21b4 Mon Sep 17 00:00:00 2001 |
| From: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> |
| Date: Mon, 20 Aug 2018 13:47:32 +0530 |
| Subject: powerpc/fadump: Do not allow hot-remove memory from fadump reserved |
| area. |
| |
| [ Upstream commit 0db6896ff6332ba694f1e61b93ae3b2640317633 ] |
| |
| For fadump to work successfully there should not be any holes in reserved |
| memory ranges where kernel has asked firmware to move the content of old |
| kernel memory in event of crash. Now that fadump uses CMA for reserved |
| area, this memory area is now not protected from hot-remove operations |
| unless it is cma allocated. Hence, fadump service can fail to re-register |
| after the hot-remove operation, if hot-removed memory belongs to fadump |
| reserved region. To avoid this make sure that memory from fadump reserved |
| area is not hot-removable if fadump is registered. |
| |
| However, if user still wants to remove that memory, he can do so by |
| manually stopping fadump service before hot-remove operation. |
| |
| Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/include/asm/fadump.h | 2 +- |
| arch/powerpc/kernel/fadump.c | 10 ++++++++-- |
| arch/powerpc/platforms/pseries/hotplug-memory.c | 7 +++++-- |
| 3 files changed, 14 insertions(+), 5 deletions(-) |
| |
| diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h |
| index 1e7a33592e29..15bc07a31c46 100644 |
| --- a/arch/powerpc/include/asm/fadump.h |
| +++ b/arch/powerpc/include/asm/fadump.h |
| @@ -200,7 +200,7 @@ struct fad_crash_memory_ranges { |
| unsigned long long size; |
| }; |
| |
| -extern int is_fadump_boot_memory_area(u64 addr, ulong size); |
| +extern int is_fadump_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); |
| diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c |
| index 5a6470383ca3..62d7ef6508de 100644 |
| --- a/arch/powerpc/kernel/fadump.c |
| +++ b/arch/powerpc/kernel/fadump.c |
| @@ -117,13 +117,19 @@ int __init early_init_dt_scan_fw_dump(unsigned long node, |
| |
| /* |
| * If fadump is registered, check if the memory provided |
| - * falls within boot memory area. |
| + * falls within boot memory area and reserved memory area. |
| */ |
| -int is_fadump_boot_memory_area(u64 addr, ulong size) |
| +int is_fadump_memory_area(u64 addr, ulong size) |
| { |
| + u64 d_start = fw_dump.reserve_dump_area_start; |
| + u64 d_end = d_start + fw_dump.reserve_dump_area_size; |
| + |
| if (!fw_dump.dump_registered) |
| return 0; |
| |
| + if (((addr + size) > d_start) && (addr <= d_end)) |
| + return 1; |
| + |
| return (addr + size) > RMA_START && addr <= fw_dump.boot_memory_size; |
| } |
| |
| diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c |
| index 1d48ab424bd9..93e09f108ca1 100644 |
| --- a/arch/powerpc/platforms/pseries/hotplug-memory.c |
| +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c |
| @@ -441,8 +441,11 @@ static bool lmb_is_removable(struct of_drconf_cell *lmb) |
| 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)) |
| + /* |
| + * Don't hot-remove memory that falls in fadump boot memory area |
| + * and memory that is reserved for capturing old kernel memory. |
| + */ |
| + if (is_fadump_memory_area(phys_addr, block_sz)) |
| return false; |
| #endif |
| |
| -- |
| 2.19.1 |
| |