powerpc/fadump: reset metadata address during clean up

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
This commit is contained in:
Hari Bathini 2019-09-11 20:21:16 +05:30 committed by Michael Ellerman
parent 742a265acc
commit 2790d01d1e
3 changed files with 17 additions and 0 deletions

View File

@ -117,6 +117,7 @@ struct fadump_ops {
int (*fadump_register)(struct fw_dump *fadump_conf); int (*fadump_register)(struct fw_dump *fadump_conf);
int (*fadump_unregister)(struct fw_dump *fadump_conf); int (*fadump_unregister)(struct fw_dump *fadump_conf);
int (*fadump_invalidate)(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); int (*fadump_process)(struct fw_dump *fadump_conf);
void (*fadump_region_show)(struct fw_dump *fadump_conf, void (*fadump_region_show)(struct fw_dump *fadump_conf,
struct seq_file *m); struct seq_file *m);

View File

@ -965,6 +965,9 @@ static int register_fadump(void)
void fadump_cleanup(void) void fadump_cleanup(void)
{ {
if (!fw_dump.fadump_supported)
return;
/* Invalidate the registration only if dump is active. */ /* Invalidate the registration only if dump is active. */
if (fw_dump.dump_active) { if (fw_dump.dump_active) {
pr_debug("Invalidating firmware-assisted dump registration\n"); pr_debug("Invalidating firmware-assisted dump registration\n");
@ -974,6 +977,9 @@ void fadump_cleanup(void)
fw_dump.ops->fadump_unregister(&fw_dump); fw_dump.ops->fadump_unregister(&fw_dump);
free_crash_memory_ranges(); 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, static void fadump_free_reserved_memory(unsigned long start_pfn,

View File

@ -105,6 +105,15 @@ static int opal_fadump_invalidate(struct fw_dump *fadump_conf)
return -EIO; 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) static int __init opal_fadump_process(struct fw_dump *fadump_conf)
{ {
return -EINVAL; return -EINVAL;
@ -145,6 +154,7 @@ static struct fadump_ops opal_fadump_ops = {
.fadump_register = opal_fadump_register, .fadump_register = opal_fadump_register,
.fadump_unregister = opal_fadump_unregister, .fadump_unregister = opal_fadump_unregister,
.fadump_invalidate = opal_fadump_invalidate, .fadump_invalidate = opal_fadump_invalidate,
.fadump_cleanup = opal_fadump_cleanup,
.fadump_process = opal_fadump_process, .fadump_process = opal_fadump_process,
.fadump_region_show = opal_fadump_region_show, .fadump_region_show = opal_fadump_region_show,
.fadump_trigger = opal_fadump_trigger, .fadump_trigger = opal_fadump_trigger,