Pass the kbuf fields to crash_prepare_headers() and set elf_headers before kexec_add_buffer(), so the error path needs no vfree() because arch_kimage_file_post_load_cleanup() will do it.
Cc: Palmer Dabbelt <[email protected]> Cc: Alexandre Ghiti <[email protected]> Cc: Baoquan He <[email protected]> Signed-off-by: Jinjie Ruan <[email protected]> --- arch/riscv/kernel/machine_kexec_file.c | 28 +++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/arch/riscv/kernel/machine_kexec_file.c b/arch/riscv/kernel/machine_kexec_file.c index 26cd2a8bd0cd..ca921b063920 100644 --- a/arch/riscv/kernel/machine_kexec_file.c +++ b/arch/riscv/kernel/machine_kexec_file.c @@ -247,39 +247,35 @@ int load_extra_segments(struct kimage *image, unsigned long kernel_start, int ret; void *fdt; unsigned long initrd_pbase = 0UL; - struct kexec_buf kbuf = {}; char *modified_cmdline = NULL; - - kbuf.image = image; - kbuf.buf_min = kernel_start + kernel_len; - kbuf.buf_max = PFN_PHYS(max_low_pfn); + struct kexec_buf kbuf = { + .image = image, + .buf_min = kernel_start + kernel_len, + .buf_max = PFN_PHYS(max_low_pfn), + }; #ifdef CONFIG_CRASH_DUMP /* Add elfcorehdr */ if (image->type == KEXEC_TYPE_CRASH) { - void *headers; - unsigned long headers_sz; - ret = crash_prepare_headers(true, &headers, &headers_sz, NULL); + ret = crash_prepare_headers(true, &kbuf.buffer, &kbuf.bufsz, NULL); if (ret) { pr_err("Preparing elf core header failed\n"); goto out; } - kbuf.buffer = headers; - kbuf.bufsz = headers_sz; + image->elf_headers = kbuf.buffer; + image->elf_headers_sz = kbuf.bufsz; + kbuf.mem = KEXEC_BUF_MEM_UNKNOWN; - kbuf.memsz = headers_sz; + kbuf.memsz = kbuf.bufsz; kbuf.buf_align = ELF_CORE_HEADER_ALIGN; kbuf.top_down = true; ret = kexec_add_buffer(&kbuf); - if (ret) { - vfree(headers); + if (ret) goto out; - } - image->elf_headers = headers; + image->elf_load_addr = kbuf.mem; - image->elf_headers_sz = headers_sz; kexec_dprintk("Loaded elf core header at 0x%lx bufsz=0x%lx memsz=0x%lx\n", image->elf_load_addr, kbuf.bufsz, kbuf.memsz); -- 2.34.1
