powerpc/fadump: provide a helpful error message
authorHari Bathini <hbathini@linux.vnet.ibm.com>
Thu, 1 Jun 2017 17:22:10 +0000 (22:52 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 28 Jun 2017 03:08:10 +0000 (13:08 +1000)
fadump fails to register when there are holes in boot memory area.
Provide a helpful error message to the user in such case.

Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/fadump.c

index 750bff3b4af3f2e57621ae03b5f8461016fe4f47..a3568136ab28736d9df62f6730afe5bfd88e7022 100644 (file)
@@ -130,6 +130,38 @@ int is_fadump_active(void)
        return fw_dump.dump_active;
 }
 
+/*
+ * Returns 1, if there are no holes in boot memory area,
+ * 0 otherwise.
+ */
+static int is_boot_memory_area_contiguous(void)
+{
+       struct memblock_region *reg;
+       unsigned long tstart, tend;
+       unsigned long start_pfn = PHYS_PFN(RMA_START);
+       unsigned long end_pfn = PHYS_PFN(RMA_START + fw_dump.boot_memory_size);
+       unsigned int ret = 0;
+
+       for_each_memblock(memory, reg) {
+               tstart = max(start_pfn, memblock_region_memory_base_pfn(reg));
+               tend = min(end_pfn, memblock_region_memory_end_pfn(reg));
+               if (tstart < tend) {
+                       /* Memory hole from start_pfn to tstart */
+                       if (tstart > start_pfn)
+                               break;
+
+                       if (tend == end_pfn) {
+                               ret = 1;
+                               break;
+                       }
+
+                       start_pfn = tend + 1;
+               }
+       }
+
+       return ret;
+}
+
 /* Print firmware assisted dump configurations for debugging purpose. */
 static void fadump_show_config(void)
 {
@@ -457,6 +489,10 @@ static int register_fw_dump(struct fadump_mem_struct *fdm)
                        " dump. Hardware Error(%d).\n", rc);
                break;
        case -3:
+               if (!is_boot_memory_area_contiguous())
+                       pr_err("Can't have holes in boot memory area while "
+                              "registering fadump\n");
+
                printk(KERN_ERR "Failed to register firmware-assisted kernel"
                        " dump. Parameter Error(%d).\n", rc);
                err = -EINVAL;