]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
powerpc/fadump: Do not allow hot-remove memory from fadump reserved area.
authorMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Mon, 20 Aug 2018 08:17:32 +0000 (13:47 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Feb 2019 18:46:07 +0000 (19:46 +0100)
[ 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
arch/powerpc/kernel/fadump.c
arch/powerpc/platforms/pseries/hotplug-memory.c

index 1e7a33592e297aae7f6e5001c20d3b005eb6d81c..15bc07a31c467c04031dbb8acc2c380be1fb0567 100644 (file)
@@ -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);
index 5a6470383ca3968af8b3f5d3eb0856238d746435..62d7ef6508de0ffe030565006bd4f12e66b61c7b 100644 (file)
@@ -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;
 }
 
index 1d48ab424bd9029a1da7ec310a76bd119c582961..93e09f108ca175b8d3ee6a6741432a470030ade8 100644 (file)
@@ -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