mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
kho: initialize kho_scratch pointer earlier in boot
In a future patch, mm init will use kho_scratch_overlap() for deciding the migrate type of pageblocks it initializes. The earliest user currently is free_area_init(). kho_scratch_overlap() relies on kho_scratch pointer being initialized. Introduce kho_memory_init_early() to do this. kho_populate() would normally be a good place to do this, but unfortunately, phys_to_virt() does not work at that point on ARM64. So we need yet another initialization function. Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org> Link: https://patch.msgid.link/20260801084833.1897543-15-pratyush@kernel.org Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
This commit is contained in:
parent
ec7c0b1a0d
commit
4513fea02a
|
|
@ -33,6 +33,7 @@ void kho_remove_subtree(void *blob);
|
|||
int kho_retrieve_subtree(const char *name, phys_addr_t *phys, size_t *size);
|
||||
|
||||
void kho_memory_init(void);
|
||||
void kho_memory_init_early(void);
|
||||
|
||||
void kho_populate(phys_addr_t fdt_phys, u64 fdt_len, phys_addr_t scratch_phys,
|
||||
u64 scratch_len);
|
||||
|
|
@ -110,6 +111,8 @@ static inline int kho_retrieve_subtree(const char *name, phys_addr_t *phys,
|
|||
|
||||
static inline void kho_memory_init(void) { }
|
||||
|
||||
static inline void kho_memory_init_early(void) { }
|
||||
|
||||
static inline void kho_populate(phys_addr_t fdt_phys, u64 fdt_len,
|
||||
phys_addr_t scratch_phys, u64 scratch_len)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1537,8 +1537,6 @@ static void __init kho_mem_retrieve(void)
|
|||
void *mem_map = kho_get_mem_map(fdt);
|
||||
int err;
|
||||
|
||||
kho_scratch = phys_to_virt(kho_in.scratch_phys);
|
||||
|
||||
/*
|
||||
* kho_get_mem_map() should always succeed. If it fails, kho_populate()
|
||||
* catches that and never sets kho_in.scratch_phys, which stops memory
|
||||
|
|
@ -1762,6 +1760,19 @@ static __init int kho_init(void)
|
|||
}
|
||||
fs_initcall(kho_init);
|
||||
|
||||
void __init kho_memory_init_early(void)
|
||||
{
|
||||
if (!is_kho_boot())
|
||||
return;
|
||||
|
||||
/*
|
||||
* kho_scratch_overlap() needs kho_scratch to be initialized. It
|
||||
* is used by free_area_init() on KHO boots, so initialize it
|
||||
* early.
|
||||
*/
|
||||
kho_scratch = phys_to_virt(kho_in.scratch_phys);
|
||||
}
|
||||
|
||||
void __init kho_memory_init(void)
|
||||
{
|
||||
if (kho_in.scratch_phys)
|
||||
|
|
|
|||
|
|
@ -2671,6 +2671,8 @@ void __init __weak mem_init(void)
|
|||
|
||||
void __init mm_core_init_early(void)
|
||||
{
|
||||
kho_memory_init_early();
|
||||
|
||||
free_area_init();
|
||||
|
||||
hugetlb_cma_reserve();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user