Commit 2377c92e37fe ("powerpc/kexec_file: fix FDT size estimation for kdump
kernel") fixed how elf64_load() estimates the FDT size needed by the
crashdump kernel.

At the same time, commit 130b2d59cec0 ("powerpc: Use common
of_kexec_alloc_and_setup_fdt()") changed the same code to use the generic
function of_kexec_alloc_and_setup_fdt() to calculate the FDT size. That
change made the code overestimate it a bit by counting twice the space
required for the kernel command line and /chosen properties.

Therefore change kexec_fdt_totalsize_ppc64() to calculate just the extra
space needed by the kdump kernel, and change the function name so that it
better reflects what the function is now doing.

Signed-off-by: Thiago Jung Bauermann <bauer...@linux.ibm.com>
Reviewed-by: Lakshmi Ramasubramanian <nra...@linux.microsoft.com>
---
 arch/powerpc/include/asm/kexec.h  |  2 +-
 arch/powerpc/kexec/elf_64.c       |  2 +-
 arch/powerpc/kexec/file_load_64.c | 26 ++++++++------------------
 3 files changed, 10 insertions(+), 20 deletions(-)

Applies on top of next-20210219.

Changes since v1:

- Adjusted comment describing kexec_extra_fdt_size_ppc64() as suggested
  by Lakshmi.

diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
index baab158e215c..5a11cc8d2350 100644
--- a/arch/powerpc/include/asm/kexec.h
+++ b/arch/powerpc/include/asm/kexec.h
@@ -128,7 +128,7 @@ int load_crashdump_segments_ppc64(struct kimage *image,
 int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,
                          const void *fdt, unsigned long kernel_load_addr,
                          unsigned long fdt_load_addr);
-unsigned int kexec_fdt_totalsize_ppc64(struct kimage *image);
+unsigned int kexec_extra_fdt_size_ppc64(struct kimage *image);
 int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
                        unsigned long initrd_load_addr,
                        unsigned long initrd_len, const char *cmdline);
diff --git a/arch/powerpc/kexec/elf_64.c b/arch/powerpc/kexec/elf_64.c
index 0492ca6003f3..5a569bb51349 100644
--- a/arch/powerpc/kexec/elf_64.c
+++ b/arch/powerpc/kexec/elf_64.c
@@ -104,7 +104,7 @@ static void *elf64_load(struct kimage *image, char 
*kernel_buf,
 
        fdt = of_kexec_alloc_and_setup_fdt(image, initrd_load_addr,
                                           initrd_len, cmdline,
-                                          kexec_fdt_totalsize_ppc64(image));
+                                          kexec_extra_fdt_size_ppc64(image));
        if (!fdt) {
                pr_err("Error setting up the new device tree.\n");
                ret = -EINVAL;
diff --git a/arch/powerpc/kexec/file_load_64.c 
b/arch/powerpc/kexec/file_load_64.c
index 3609de30a170..297f73795a1f 100644
--- a/arch/powerpc/kexec/file_load_64.c
+++ b/arch/powerpc/kexec/file_load_64.c
@@ -927,37 +927,27 @@ int setup_purgatory_ppc64(struct kimage *image, const 
void *slave_code,
 }
 
 /**
- * kexec_fdt_totalsize_ppc64 - Return the estimated size needed to setup FDT
- *                             for kexec/kdump kernel.
- * @image:                     kexec image being loaded.
+ * kexec_extra_fdt_size_ppc64 - Return the estimated additional size needed to
+ *                              setup FDT for kexec/kdump kernel.
+ * @image:                      kexec image being loaded.
  *
- * Returns the estimated size needed for kexec/kdump kernel FDT.
+ * Returns the estimated extra size needed for kexec/kdump kernel FDT.
  */
-unsigned int kexec_fdt_totalsize_ppc64(struct kimage *image)
+unsigned int kexec_extra_fdt_size_ppc64(struct kimage *image)
 {
-       unsigned int fdt_size;
        u64 usm_entries;
 
-       /*
-        * The below estimate more than accounts for a typical kexec case where
-        * the additional space is to accommodate things like kexec cmdline,
-        * chosen node with properties for initrd start & end addresses and
-        * a property to indicate kexec boot..
-        */
-       fdt_size = fdt_totalsize(initial_boot_params) + (2 * COMMAND_LINE_SIZE);
        if (image->type != KEXEC_TYPE_CRASH)
-               return fdt_size;
+               return 0;
 
        /*
-        * For kdump kernel, also account for linux,usable-memory and
+        * For kdump kernel, account for linux,usable-memory and
         * linux,drconf-usable-memory properties. Get an approximate on the
         * number of usable memory entries and use for FDT size estimation.
         */
        usm_entries = ((memblock_end_of_DRAM() / drmem_lmb_size()) +
                       (2 * (resource_size(&crashk_res) / drmem_lmb_size())));
-       fdt_size += (unsigned int)(usm_entries * sizeof(u64));
-
-       return fdt_size;
+       return (unsigned int)(usm_entries * sizeof(u64));
 }
 
 /**

Reply via email to