powerpc/opalcore: provide an option to invalidate /sys/firmware/opal/core file
authorHari Bathini <hbathini@linux.ibm.com>
Wed, 11 Sep 2019 14:56:45 +0000 (20:26 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 13 Sep 2019 14:04:45 +0000 (00:04 +1000)
Writing '1' to /sys/kernel/fadump_release_opalcore would release the
memory held by kernel in exporting /sys/firmware/opal/core file.

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

index 6fa6b8a..ed895d8 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/proc_fs.h>
 #include <linux/elf.h>
 #include <linux/elfcore.h>
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
 #include <linux/slab.h>
 #include <linux/crash_core.h>
 #include <linux/of.h>
@@ -561,6 +563,36 @@ error_out:
        of_node_put(np);
 }
 
+static ssize_t fadump_release_opalcore_store(struct kobject *kobj,
+                                            struct kobj_attribute *attr,
+                                            const char *buf, size_t count)
+{
+       int input = -1;
+
+       if (kstrtoint(buf, 0, &input))
+               return -EINVAL;
+
+       if (input == 1) {
+               if (oc_conf == NULL) {
+                       pr_err("'/sys/firmware/opal/core' file not accessible!\n");
+                       return -EPERM;
+               }
+
+               /*
+                * Take away '/sys/firmware/opal/core' and release all memory
+                * used for exporting this file.
+                */
+               opalcore_cleanup();
+       } else
+               return -EINVAL;
+
+       return count;
+}
+
+static struct kobj_attribute opalcore_rel_attr = __ATTR(fadump_release_opalcore,
+                                               0200, NULL,
+                                               fadump_release_opalcore_store);
+
 static int __init opalcore_init(void)
 {
        int rc = -1;
@@ -593,6 +625,12 @@ static int __init opalcore_init(void)
                return rc;
        }
 
+       rc = sysfs_create_file(kernel_kobj, &opalcore_rel_attr.attr);
+       if (rc) {
+               pr_warn("unable to create sysfs file fadump_release_opalcore (%d)\n",
+                       rc);
+       }
+
        return 0;
 }
 fs_initcall(opalcore_init);