On 26/02/24 2:11 pm, Sourabh Jain wrote:
Move the update_cpus_node() from kexec/{file_load_64.c => core_64.c}
to allow other kexec components to use it.

Later in the series, this function is used for in-kernel updates
to the kdump image during CPU/memory hotplug or online/offline events for
both kexec_load and kexec_file_load syscalls.

No functional changes are intended.


Looks good to me.

Acked-by: Hari Bathini <hbath...@linux.ibm.com>

Signed-off-by: Sourabh Jain <sourabhj...@linux.ibm.com>
Cc: Akhil Raj <lf32....@gmail.com>
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Aneesh Kumar K.V <aneesh.ku...@kernel.org>
Cc: Baoquan He <b...@redhat.com>
Cc: Borislav Petkov (AMD) <b...@alien8.de>
Cc: Boris Ostrovsky <boris.ostrov...@oracle.com>
Cc: Christophe Leroy <christophe.le...@csgroup.eu>
Cc: Dave Hansen <dave.han...@linux.intel.com>
Cc: Dave Young <dyo...@redhat.com>
Cc: David Hildenbrand <da...@redhat.com>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
Cc: Hari Bathini <hbath...@linux.ibm.com>
Cc: Laurent Dufour <laurent.duf...@fr.ibm.com>
Cc: Mahesh Salgaonkar <mah...@linux.ibm.com>
Cc: Michael Ellerman <m...@ellerman.id.au>
Cc: Mimi Zohar <zo...@linux.ibm.com>
Cc: Naveen N Rao <nav...@kernel.org>
Cc: Oscar Salvador <osalva...@suse.de>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Valentin Schneider <vschn...@redhat.com>
Cc: Vivek Goyal <vgo...@redhat.com>
Cc: kexec@lists.infradead.org
Cc: x...@kernel.org
---
  arch/powerpc/include/asm/kexec.h  |  4 ++
  arch/powerpc/kexec/core_64.c      | 91 +++++++++++++++++++++++++++++++
  arch/powerpc/kexec/file_load_64.c | 87 -----------------------------
  3 files changed, 95 insertions(+), 87 deletions(-)

diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
index fdb90e24dc74..d9ff4d0e392d 100644
--- a/arch/powerpc/include/asm/kexec.h
+++ b/arch/powerpc/include/asm/kexec.h
@@ -185,6 +185,10 @@ static inline void crash_send_ipi(void 
(*crash_ipi_callback)(struct pt_regs *))
#endif /* CONFIG_CRASH_DUMP */ +#if defined(CONFIG_KEXEC_FILE) || defined(CONFIG_CRASH_DUMP)
+int update_cpus_node(void *fdt);
+#endif
+
  #ifdef CONFIG_PPC_BOOK3S_64
  #include <asm/book3s/64/kexec.h>
  #endif
diff --git a/arch/powerpc/kexec/core_64.c b/arch/powerpc/kexec/core_64.c
index 762e4d09aacf..85050be08a23 100644
--- a/arch/powerpc/kexec/core_64.c
+++ b/arch/powerpc/kexec/core_64.c
@@ -17,6 +17,7 @@
  #include <linux/cpu.h>
  #include <linux/hardirq.h>
  #include <linux/of.h>
+#include <linux/libfdt.h>
#include <asm/page.h>
  #include <asm/current.h>
@@ -30,6 +31,7 @@
  #include <asm/hw_breakpoint.h>
  #include <asm/svm.h>
  #include <asm/ultravisor.h>
+#include <asm/crashdump-ppc64.h>
int machine_kexec_prepare(struct kimage *image)
  {
@@ -419,3 +421,92 @@ static int __init export_htab_values(void)
  }
  late_initcall(export_htab_values);
  #endif /* CONFIG_PPC_64S_HASH_MMU */
+
+#if defined(CONFIG_KEXEC_FILE) || defined(CONFIG_CRASH_DUMP)
+/**
+ * add_node_props - Reads node properties from device node structure and add
+ *                  them to fdt.
+ * @fdt:            Flattened device tree of the kernel
+ * @node_offset:    offset of the node to add a property at
+ * @dn:             device node pointer
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+static int add_node_props(void *fdt, int node_offset, const struct device_node 
*dn)
+{
+       int ret = 0;
+       struct property *pp;
+
+       if (!dn)
+               return -EINVAL;
+
+       for_each_property_of_node(dn, pp) {
+               ret = fdt_setprop(fdt, node_offset, pp->name, pp->value, 
pp->length);
+               if (ret < 0) {
+                       pr_err("Unable to add %s property: %s\n", pp->name, 
fdt_strerror(ret));
+                       return ret;
+               }
+       }
+       return ret;
+}
+
+/**
+ * update_cpus_node - Update cpus node of flattened device tree using of_root
+ *                    device node.
+ * @fdt:              Flattened device tree of the kernel.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+int update_cpus_node(void *fdt)
+{
+       struct device_node *cpus_node, *dn;
+       int cpus_offset, cpus_subnode_offset, ret = 0;
+
+       cpus_offset = fdt_path_offset(fdt, "/cpus");
+       if (cpus_offset < 0 && cpus_offset != -FDT_ERR_NOTFOUND) {
+               pr_err("Malformed device tree: error reading /cpus node: %s\n",
+                      fdt_strerror(cpus_offset));
+               return cpus_offset;
+       }
+
+       if (cpus_offset > 0) {
+               ret = fdt_del_node(fdt, cpus_offset);
+               if (ret < 0) {
+                       pr_err("Error deleting /cpus node: %s\n", 
fdt_strerror(ret));
+                       return -EINVAL;
+               }
+       }
+
+       /* Add cpus node to fdt */
+       cpus_offset = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), "cpus");
+       if (cpus_offset < 0) {
+               pr_err("Error creating /cpus node: %s\n", 
fdt_strerror(cpus_offset));
+               return -EINVAL;
+       }
+
+       /* Add cpus node properties */
+       cpus_node = of_find_node_by_path("/cpus");
+       ret = add_node_props(fdt, cpus_offset, cpus_node);
+       of_node_put(cpus_node);
+       if (ret < 0)
+               return ret;
+
+       /* Loop through all subnodes of cpus and add them to fdt */
+       for_each_node_by_type(dn, "cpu") {
+               cpus_subnode_offset = fdt_add_subnode(fdt, cpus_offset, 
dn->full_name);
+               if (cpus_subnode_offset < 0) {
+                       pr_err("Unable to add %s subnode: %s\n", dn->full_name,
+                              fdt_strerror(cpus_subnode_offset));
+                       ret = cpus_subnode_offset;
+                       goto out;
+               }
+
+               ret = add_node_props(fdt, cpus_subnode_offset, dn);
+               if (ret < 0)
+                       goto out;
+       }
+out:
+       of_node_put(dn);
+       return ret;
+}
+#endif /* CONFIG_KEXEC_FILE || CONFIG_CRASH_DUMP */
diff --git a/arch/powerpc/kexec/file_load_64.c 
b/arch/powerpc/kexec/file_load_64.c
index 6a01f62b8fcf..4b94c31e3172 100644
--- a/arch/powerpc/kexec/file_load_64.c
+++ b/arch/powerpc/kexec/file_load_64.c
@@ -838,93 +838,6 @@ unsigned int kexec_extra_fdt_size_ppc64(struct kimage 
*image)
        return extra_size + kdump_extra_fdt_size_ppc64(image);
  }
-/**
- * add_node_props - Reads node properties from device node structure and add
- *                  them to fdt.
- * @fdt:            Flattened device tree of the kernel
- * @node_offset:    offset of the node to add a property at
- * @dn:             device node pointer
- *
- * Returns 0 on success, negative errno on error.
- */
-static int add_node_props(void *fdt, int node_offset, const struct device_node 
*dn)
-{
-       int ret = 0;
-       struct property *pp;
-
-       if (!dn)
-               return -EINVAL;
-
-       for_each_property_of_node(dn, pp) {
-               ret = fdt_setprop(fdt, node_offset, pp->name, pp->value, 
pp->length);
-               if (ret < 0) {
-                       pr_err("Unable to add %s property: %s\n", pp->name, 
fdt_strerror(ret));
-                       return ret;
-               }
-       }
-       return ret;
-}
-
-/**
- * update_cpus_node - Update cpus node of flattened device tree using of_root
- *                    device node.
- * @fdt:              Flattened device tree of the kernel.
- *
- * Returns 0 on success, negative errno on error.
- */
-static int update_cpus_node(void *fdt)
-{
-       struct device_node *cpus_node, *dn;
-       int cpus_offset, cpus_subnode_offset, ret = 0;
-
-       cpus_offset = fdt_path_offset(fdt, "/cpus");
-       if (cpus_offset < 0 && cpus_offset != -FDT_ERR_NOTFOUND) {
-               pr_err("Malformed device tree: error reading /cpus node: %s\n",
-                      fdt_strerror(cpus_offset));
-               return cpus_offset;
-       }
-
-       if (cpus_offset > 0) {
-               ret = fdt_del_node(fdt, cpus_offset);
-               if (ret < 0) {
-                       pr_err("Error deleting /cpus node: %s\n", 
fdt_strerror(ret));
-                       return -EINVAL;
-               }
-       }
-
-       /* Add cpus node to fdt */
-       cpus_offset = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), "cpus");
-       if (cpus_offset < 0) {
-               pr_err("Error creating /cpus node: %s\n", 
fdt_strerror(cpus_offset));
-               return -EINVAL;
-       }
-
-       /* Add cpus node properties */
-       cpus_node = of_find_node_by_path("/cpus");
-       ret = add_node_props(fdt, cpus_offset, cpus_node);
-       of_node_put(cpus_node);
-       if (ret < 0)
-               return ret;
-
-       /* Loop through all subnodes of cpus and add them to fdt */
-       for_each_node_by_type(dn, "cpu") {
-               cpus_subnode_offset = fdt_add_subnode(fdt, cpus_offset, 
dn->full_name);
-               if (cpus_subnode_offset < 0) {
-                       pr_err("Unable to add %s subnode: %s\n", dn->full_name,
-                              fdt_strerror(cpus_subnode_offset));
-                       ret = cpus_subnode_offset;
-                       goto out;
-               }
-
-               ret = add_node_props(fdt, cpus_subnode_offset, dn);
-               if (ret < 0)
-                       goto out;
-       }
-out:
-       of_node_put(dn);
-       return ret;
-}
-
  static int copy_property(void *fdt, int node_offset, const struct device_node 
*dn,
                         const char *propname)
  {

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to