[PATCH 2/2] powerpc: avoid adjusting memory_limit for capture kernel memory reservation

Michal Suchánek msuchanek at suse.de
Tue Jan 7 03:10:41 AEDT 2020


On Wed, Jul 24, 2019 at 11:26:59AM +0530, Mahesh Jagannath Salgaonkar wrote:
> On 7/22/19 11:19 PM, Michal Suchánek wrote:
> > On Fri, 28 Jun 2019 00:51:19 +0530
> > Hari Bathini <hbathini at linux.ibm.com> wrote:
> > 
> >> Currently, if memory_limit is specified and it overlaps with memory to
> >> be reserved for capture kernel, memory_limit is adjusted to accommodate
> >> capture kernel. With memory reservation for capture kernel moved later
> >> (after enforcing memory limit), this adjustment no longer holds water.
> >> So, avoid adjusting memory_limit and error out instead.
> > 
> > Can you split out the memory limit adjustment out of memory reservation
> > so it can still be adjusted?
> 
> Do you mean adjust the memory limit before we do the actual reservation ?

Yes, without that you get a regression in ability to enable fadump with
limited memory - something like the below patch should fix it. Then
again, there is no code to un-move the memory_limit in case the allocation
fails, and we now have cma allocation which is dubious to allocate
beyond memory_limit. So maybe removing the memory_limit adjustment is a
bugfix removing 'feature' that has bitrotten over time.

Thanks

Michal

From: Michal Suchanek <msuchanek at suse.de>
Date: Mon, 6 Jan 2020 14:55:40 +0100
Subject: [PATCH 2/2] powerpc/fadump: adjust memlimit before MMU early init

Moving the farump memory reservation before early MMU init makes the
memlimit adjustment to make room for fadump ineffective.

Move the adjustment back before early MMU init.

Signed-off-by: Michal Suchanek <msuchanek at suse.de>
---
 arch/powerpc/include/asm/fadump.h |  3 +-
 arch/powerpc/kernel/fadump.c      | 80 +++++++++++++++++++++++--------
 arch/powerpc/kernel/prom.c        |  3 ++
 3 files changed, 66 insertions(+), 20 deletions(-)

diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h
index 526a6a647312..76d3cbe1379c 100644
--- a/arch/powerpc/include/asm/fadump.h
+++ b/arch/powerpc/include/asm/fadump.h
@@ -30,6 +30,7 @@ static inline void fadump_cleanup(void) { }
 #if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP)
 extern int early_init_dt_scan_fw_dump(unsigned long node, const char *uname,
 				      int depth, void *data);
-extern int fadump_reserve_mem(void);
+int fadump_adjust_memlimit(void);
+int fadump_reserve_mem(void);
 #endif
 #endif /* _ASM_POWERPC_FADUMP_H */
diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c
index 8ad6d8d1cdbe..4d76452dcb3d 100644
--- a/arch/powerpc/kernel/fadump.c
+++ b/arch/powerpc/kernel/fadump.c
@@ -431,19 +431,22 @@ static int __init fadump_get_boot_mem_regions(void)
 	return ret;
 }
 
-int __init fadump_reserve_mem(void)
+static inline u64 fadump_get_reserve_alignment(void)
 {
-	u64 base, size, mem_boundary, bootmem_min, align = PAGE_SIZE;
-	bool is_memblock_bottom_up = memblock_bottom_up();
-	int ret = 1;
+	u64 align = PAGE_SIZE;
 
-	if (!fw_dump.fadump_enabled)
-		return 0;
+#ifdef CONFIG_CMA
+	if (!fw_dump.nocma)
+		align = FADUMP_CMA_ALIGNMENT;
+#endif
 
-	if (!fw_dump.fadump_supported) {
-		pr_info("Firmware-Assisted Dump is not supported on this hardware\n");
-		goto error_out;
-	}
+	return align;
+}
+
+static inline u64 fadump_get_bootmem_min(void)
+{
+	u64 bootmem_min = 0;
+	u64 align = fadump_get_reserve_alignment();
 
 	/*
 	 * Initialize boot memory size
@@ -455,7 +458,6 @@ int __init fadump_reserve_mem(void)
 			PAGE_ALIGN(fadump_calculate_reserve_size());
 #ifdef CONFIG_CMA
 		if (!fw_dump.nocma) {
-			align = FADUMP_CMA_ALIGNMENT;
 			fw_dump.boot_memory_size =
 				ALIGN(fw_dump.boot_memory_size, align);
 		}
@@ -472,8 +474,43 @@ int __init fadump_reserve_mem(void)
 			pr_err("Too many holes in boot memory area to enable fadump\n");
 			goto error_out;
 		}
+
+	}
+
+	return bootmem_min;
+error_out:
+	fw_dump.fadump_enabled = 0;
+	return 0;
+}
+
+int __init fadump_adjust_memlimit(void)
+{
+	u64 size, bootmem_min;
+
+	if (!fw_dump.fadump_enabled)
+		return 0;
+
+	if (!fw_dump.fadump_supported) {
+		pr_info("Firmware-Assisted Dump is not supported on this hardware\n");
+		fw_dump.fadump_enabled = 0;
+		return 0;
 	}
 
+#ifdef CONFIG_HUGETLB_PAGE
+	if (fw_dump.dump_active) {
+		/*
+		 * FADump capture kernel doesn't care much about hugepages.
+		 * In fact, handling hugepages in capture kernel is asking for
+		 * trouble. So, disable HugeTLB support when fadump is active.
+		 */
+		hugetlb_disabled = true;
+	}
+#endif
+
+	bootmem_min = fadump_get_bootmem_min();
+	if (!bootmem_min)
+		return 0;
+
 	/*
 	 * Calculate the memory boundary.
 	 * If memory_limit is less than actual memory boundary then reserve
@@ -490,6 +527,19 @@ int __init fadump_reserve_mem(void)
 		printk(KERN_INFO "Adjusted memory_limit for firmware-assisted"
 				" dump, now %#016llx\n", memory_limit);
 	}
+
+	return 0;
+}
+
+int __init fadump_reserve_mem(void)
+{
+	u64 base, size, mem_boundary, align = fadump_get_reserve_alignment();
+	bool is_memblock_bottom_up = memblock_bottom_up();
+	int ret = 1;
+
+	if (!fw_dump.fadump_enabled)
+		return 0;
+
 	if (memory_limit)
 		mem_boundary = memory_limit;
 	else
@@ -501,14 +551,6 @@ int __init fadump_reserve_mem(void)
 	if (fw_dump.dump_active) {
 		pr_info("Firmware-assisted dump is active.\n");
 
-#ifdef CONFIG_HUGETLB_PAGE
-		/*
-		 * FADump capture kernel doesn't care much about hugepages.
-		 * In fact, handling hugepages in capture kernel is asking for
-		 * trouble. So, disable HugeTLB support when fadump is active.
-		 */
-		hugetlb_disabled = true;
-#endif
 		/*
 		 * If last boot has crashed then reserve all the memory
 		 * above boot memory size so that we don't touch it until
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 7b6cdd9bf78d..4fff8c2222b1 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -731,6 +731,9 @@ void __init early_init_devtree(void *params)
 	if (PHYSICAL_START > MEMORY_START)
 		memblock_reserve(MEMORY_START, 0x8000);
 	reserve_kdump_trampoline();
+#if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP)
+	fadump_adjust_memlimit();
+#endif
 	early_reserve_mem();
 
 	/* Ensure that total memory size is page-aligned. */
-- 
2.23.0



More information about the Linuxppc-dev mailing list