[PATCH 11/12] kho: return virtual address of mem_map
Pratyush Yadav
pratyush at kernel.org
Wed Apr 29 06:39:13 PDT 2026
From: "Pratyush Yadav (Google)" <pratyush at kernel.org>
There are currently 3 callers of kho_get_mem_map_phys(). Two of them,
kho_mem_retrieve() and kho_extend_scratch() need the virtual address.
The third, kho_populate() doesn't care. Make things simpler by
directly returning the virtual address. Rename kho_get_mem_map_phys() to
kho_get_mem_map() to accurately reflect what it returns.
Signed-off-by: Pratyush Yadav (Google) <pratyush at kernel.org>
---
kernel/liveupdate/kexec_handover.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
index c2b843a5fb28..2e13b80d1c7d 100644
--- a/kernel/liveupdate/kexec_handover.c
+++ b/kernel/liveupdate/kexec_handover.c
@@ -625,10 +625,11 @@ static int __init kho_preserved_memory_reserve(unsigned long key, void *data)
return 0;
}
-/* Returns physical address of the preserved memory map from FDT */
-static phys_addr_t __init kho_get_mem_map_phys(const void *fdt)
+/* Returns virtual address of the preserved memory map from FDT */
+static __init void *kho_get_mem_map(const void *fdt)
{
const void *mem_ptr;
+ phys_addr_t mem_map_phys;
int len;
mem_ptr = fdt_getprop(fdt, 0, KHO_FDT_MEMORY_MAP_PROP_NAME, &len);
@@ -637,7 +638,11 @@ static phys_addr_t __init kho_get_mem_map_phys(const void *fdt)
return 0;
}
- return get_unaligned((const u64 *)mem_ptr);
+ mem_map_phys = get_unaligned((const u64 *)mem_ptr);
+ if (!mem_map_phys)
+ return NULL;
+
+ return phys_to_virt(mem_map_phys);
}
/*
@@ -932,15 +937,15 @@ void __init kho_extend_scratch(void)
.key = kho_ext_mark_scratch,
};
struct kho_radix_tree radix;
- phys_addr_t prev_end = 0, mem_map_phys;
+ phys_addr_t prev_end = 0;
int err = 0;
if (!is_kho_boot())
return;
/* Make sure the KHO radix tree is initialized. */
- mem_map_phys = kho_get_mem_map_phys(kho_get_fdt());
- err = kho_radix_init_tree(&kho_in.radix_tree, phys_to_virt(mem_map_phys));
+ err = kho_radix_init_tree(&kho_in.radix_tree,
+ kho_get_mem_map(kho_get_fdt()));
if (err)
goto print;
@@ -1587,11 +1592,9 @@ static int __init kho_mem_retrieve(const void *fdt)
const struct kho_radix_walk_cb cb = {
.key = kho_preserved_memory_reserve,
};
- phys_addr_t mem_map_phys;
int err;
- mem_map_phys = kho_get_mem_map_phys(fdt);
- err = kho_radix_init_tree(&kho_in.radix_tree, phys_to_virt(mem_map_phys));
+ err = kho_radix_init_tree(&kho_in.radix_tree, kho_get_mem_map(fdt));
if (err)
return err;
@@ -1816,8 +1819,7 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len,
{
unsigned int scratch_cnt = scratch_len / sizeof(*kho_scratch);
struct kho_scratch *scratch = NULL;
- phys_addr_t mem_map_phys;
- void *fdt = NULL;
+ void *fdt = NULL, *mem_map;
bool populated = false;
int err;
@@ -1840,8 +1842,8 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len,
goto unmap_fdt;
}
- mem_map_phys = kho_get_mem_map_phys(fdt);
- if (!mem_map_phys)
+ mem_map = kho_get_mem_map(fdt);
+ if (!mem_map)
goto unmap_fdt;
scratch = early_memremap(scratch_phys, scratch_len);
--
2.54.0.545.g6539524ca2-goog
More information about the kexec
mailing list