powerpc/fadump: reset metadata address during clean up
authorHari Bathini <hbathini@linux.ibm.com>
Wed, 11 Sep 2019 14:51:16 +0000 (20:21 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 13 Sep 2019 14:04:43 +0000 (00:04 +1000)
During kexec boot, metadata address needs to be reset to avoid running
into errors interpreting stale metadata address, in case the kexec'ed
kernel crashes before metadata address could be setup again.

Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/156821346629.5656.10783321582005237813.stgit@hbathini.in.ibm.com
arch/powerpc/include/asm/fadump-internal.h
arch/powerpc/kernel/fadump.c
arch/powerpc/platforms/powernv/opal-fadump.c

index 5262c764c5fc858c218533be8d36708a2199059a..0c2c4f58d36508e7af940c2d3ddd072cbbcd6f05 100644 (file)
@@ -117,6 +117,7 @@ struct fadump_ops {
        int     (*fadump_register)(struct fw_dump *fadump_conf);
        int     (*fadump_unregister)(struct fw_dump *fadump_conf);
        int     (*fadump_invalidate)(struct fw_dump *fadump_conf);
+       void    (*fadump_cleanup)(struct fw_dump *fadump_conf);
        int     (*fadump_process)(struct fw_dump *fadump_conf);
        void    (*fadump_region_show)(struct fw_dump *fadump_conf,
                                      struct seq_file *m);
index 7e7056382d9872d84fe999c9dd59fa722447a9d0..aab9b4db0363f1e396a337cf563387795dc55913 100644 (file)
@@ -965,6 +965,9 @@ static int register_fadump(void)
 
 void fadump_cleanup(void)
 {
+       if (!fw_dump.fadump_supported)
+               return;
+
        /* Invalidate the registration only if dump is active. */
        if (fw_dump.dump_active) {
                pr_debug("Invalidating firmware-assisted dump registration\n");
@@ -974,6 +977,9 @@ void fadump_cleanup(void)
                fw_dump.ops->fadump_unregister(&fw_dump);
                free_crash_memory_ranges();
        }
+
+       if (fw_dump.ops->fadump_cleanup)
+               fw_dump.ops->fadump_cleanup(&fw_dump);
 }
 
 static void fadump_free_reserved_memory(unsigned long start_pfn,
index 21de832f2ba44d2c9f21e0773aea9f524213491f..871a129c73d3503810840b47e57b22a57c7efc2e 100644 (file)
@@ -105,6 +105,15 @@ static int opal_fadump_invalidate(struct fw_dump *fadump_conf)
        return -EIO;
 }
 
+static void opal_fadump_cleanup(struct fw_dump *fadump_conf)
+{
+       s64 ret;
+
+       ret = opal_mpipl_register_tag(OPAL_MPIPL_TAG_KERNEL, 0);
+       if (ret != OPAL_SUCCESS)
+               pr_warn("Could not reset (%llu) kernel metadata tag!\n", ret);
+}
+
 static int __init opal_fadump_process(struct fw_dump *fadump_conf)
 {
        return -EINVAL;
@@ -145,6 +154,7 @@ static struct fadump_ops opal_fadump_ops = {
        .fadump_register                = opal_fadump_register,
        .fadump_unregister              = opal_fadump_unregister,
        .fadump_invalidate              = opal_fadump_invalidate,
+       .fadump_cleanup                 = opal_fadump_cleanup,
        .fadump_process                 = opal_fadump_process,
        .fadump_region_show             = opal_fadump_region_show,
        .fadump_trigger                 = opal_fadump_trigger,