powerpc/fadump: Throw proper error message on fadump registration failure
authorMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Mon, 20 Aug 2018 08:17:24 +0000 (13:47 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 21 Dec 2018 00:32:49 +0000 (11:32 +1100)
fadump fails to register when there are holes in reserved memory area.
This can happen if user has hot-removed a memory that falls in the
fadump reserved memory area. Throw a meaningful error message to the
user in such case.

Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
[mpe: is_reserved_memory_area_contiguous() returns bool, unsplit string]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/fadump.c

index ec937c7..b7f83d6 100644 (file)
@@ -237,6 +237,35 @@ static int is_boot_memory_area_contiguous(void)
        return ret;
 }
 
+/*
+ * Returns true, if there are no holes in reserved memory area,
+ * false otherwise.
+ */
+static bool is_reserved_memory_area_contiguous(void)
+{
+       struct memblock_region *reg;
+       unsigned long start, end;
+       unsigned long d_start = fw_dump.reserve_dump_area_start;
+       unsigned long d_end = d_start + fw_dump.reserve_dump_area_size;
+
+       for_each_memblock(memory, reg) {
+               start = max(d_start, (unsigned long)reg->base);
+               end = min(d_end, (unsigned long)(reg->base + reg->size));
+               if (d_start < end) {
+                       /* Memory hole from d_start to start */
+                       if (start > d_start)
+                               break;
+
+                       if (end == d_end)
+                               return true;
+
+                       d_start = end + 1;
+               }
+       }
+
+       return false;
+}
+
 /* Print firmware assisted dump configurations for debugging purpose. */
 static void fadump_show_config(void)
 {
@@ -603,8 +632,10 @@ static int register_fw_dump(struct fadump_mem_struct *fdm)
                break;
        case -3:
                if (!is_boot_memory_area_contiguous())
-                       pr_err("Can't have holes in boot memory area while "
-                              "registering fadump\n");
+                       pr_err("Can't have holes in boot memory area while registering fadump\n");
+               else if (!is_reserved_memory_area_contiguous())
+                       pr_err("Can't have holes in reserved memory area while"
+                              " registering fadump\n");
 
                printk(KERN_ERR "Failed to register firmware-assisted kernel"
                        " dump. Parameter Error(%d).\n", rc);