Move FDT initialization logic from kho_populate() into a new helper function kho_fdt_init(). The helper takes care of mapping, validating, and unmapping the FDT. This prepares for using KSTATE in KHO instead of FDT. Signed-off-by: Andrey Ryabinin --- kernel/liveupdate/kexec_handover.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c index 364a69a2fa1b..e5a436893f5b 100644 --- a/kernel/liveupdate/kexec_handover.c +++ b/kernel/liveupdate/kexec_handover.c @@ -1077,13 +1077,10 @@ void __init kho_memory_init(void) } } -void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len, - phys_addr_t scratch_phys, u64 scratch_len) +static int __init kho_fdt_init(phys_addr_t fdt_phys, u64 fdt_len) { void *fdt = NULL; - struct kho_scratch *scratch = NULL; int err = 0; - unsigned int scratch_cnt = scratch_len / sizeof(*kho_scratch); /* Validate the input FDT */ fdt = early_memremap(fdt_phys, fdt_len); @@ -1107,6 +1104,26 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len, goto out; } +out: + if (fdt) + early_memunmap(fdt, fdt_len); + + return err; +} + +void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len, + phys_addr_t scratch_phys, u64 scratch_len) +{ + + struct kho_scratch *scratch = NULL; + int err = 0; + unsigned int scratch_cnt = scratch_len / sizeof(*kho_scratch); + + + err = kho_fdt_init(fdt_phys, fdt_len); + if (err) + goto out; + scratch = early_memremap(scratch_phys, scratch_len); if (!scratch) { pr_warn("setup: failed to memremap scratch (phys=0x%llx, len=%lld)\n", @@ -1151,8 +1168,6 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len, pr_info("found kexec handover data. Will skip init for some devices\n"); out: - if (fdt) - early_memunmap(fdt, fdt_len); if (scratch) early_memunmap(scratch, scratch_len); if (err) -- 2.49.1