mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
kho: add kho_radix_init_tree()
Move the initialization logic of the radix tree into kho_radix_init_tree() instead of having users open-code it. Makes the boundaries cleaner and reduces code duplication when a new user of the radix tree will be added in a future commit. Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org> Link: https://patch.msgid.link/20260801084833.1897543-13-pratyush@kernel.org Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
This commit is contained in:
parent
a8ea530d7d
commit
6442bfb211
|
|
@ -58,6 +58,7 @@ int kho_radix_add_key(struct kho_radix_tree *tree, unsigned long key);
|
|||
void kho_radix_del_key(struct kho_radix_tree *tree, unsigned long key);
|
||||
int kho_radix_walk_tree(struct kho_radix_tree *tree,
|
||||
const struct kho_radix_walk_cb *cb, void *data);
|
||||
int kho_radix_init_tree(struct kho_radix_tree *tree, struct kho_radix_node *root);
|
||||
void kho_radix_destroy_tree(struct kho_radix_tree *tree);
|
||||
|
||||
#else /* #ifdef CONFIG_KEXEC_HANDOVER */
|
||||
|
|
@ -76,6 +77,12 @@ static inline int kho_radix_walk_tree(struct kho_radix_tree *tree,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int kho_radix_init_tree(struct kho_radix_tree *tree,
|
||||
struct kho_radix_node *root)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void kho_radix_destroy_tree(struct kho_radix_tree *tree) { }
|
||||
|
||||
#endif /* #ifdef CONFIG_KEXEC_HANDOVER */
|
||||
|
|
|
|||
|
|
@ -320,6 +320,30 @@ static void __kho_radix_destroy_tree(struct kho_radix_node *root,
|
|||
kho_radix_free_node(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* kho_radix_init_tree - initialize the radix tree.
|
||||
* @tree: the tree to initialize.
|
||||
* @root: root table of the radix tree.
|
||||
*
|
||||
* Initialize the radix tree with the given root node. If root is %NULL, an
|
||||
* empty root table is allocated. If root is not %NULL, it is the caller's
|
||||
* responsibility to make sure the root is valid and in the correct format.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int kho_radix_init_tree(struct kho_radix_tree *tree, struct kho_radix_node *root)
|
||||
{
|
||||
if (!root)
|
||||
root = kho_radix_alloc_node();
|
||||
if (!root)
|
||||
return -ENOMEM;
|
||||
|
||||
tree->root = root;
|
||||
mutex_init(&tree->lock);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kho_radix_init_tree);
|
||||
|
||||
/**
|
||||
* kho_radix_destroy_tree - Destroy the radix tree
|
||||
* @tree: The radix tree to destroy
|
||||
|
|
@ -1505,18 +1529,23 @@ static void __init kho_mem_retrieve(void)
|
|||
if (WARN_ON(!mem_map))
|
||||
return;
|
||||
|
||||
kho_in.radix_tree.root = mem_map;
|
||||
mutex_init(&kho_in.radix_tree.lock);
|
||||
err = kho_radix_init_tree(&kho_in.radix_tree, mem_map);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = kho_radix_walk_tree(&kho_in.radix_tree, &cb, NULL);
|
||||
if (err) {
|
||||
/*
|
||||
* Failed to initialize preserved memory. Clear FDT and radix
|
||||
* so KHO users don't treat it as a KHO boot.
|
||||
*/
|
||||
kho_in.fdt_phys = 0;
|
||||
kho_in.radix_tree.root = NULL;
|
||||
}
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
return;
|
||||
|
||||
err:
|
||||
/*
|
||||
* Failed to initialize preserved memory. Clear FDT and radix so KHO
|
||||
* users don't treat it as a KHO boot.
|
||||
*/
|
||||
kho_in.fdt_phys = 0;
|
||||
kho_in.radix_tree.root = NULL;
|
||||
}
|
||||
|
||||
static __init int kho_out_fdt_setup(void)
|
||||
|
|
@ -1642,16 +1671,14 @@ static __init int kho_init(void)
|
|||
if (!kho_enable)
|
||||
return 0;
|
||||
|
||||
tree->root = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
if (!tree->root) {
|
||||
err = -ENOMEM;
|
||||
err = kho_radix_init_tree(tree, NULL);
|
||||
if (err)
|
||||
goto err_free_scratch;
|
||||
}
|
||||
|
||||
kho_out.fdt = kho_alloc_preserve(PAGE_SIZE);
|
||||
if (IS_ERR(kho_out.fdt)) {
|
||||
err = PTR_ERR(kho_out.fdt);
|
||||
goto err_free_kho_radix_tree_root;
|
||||
goto err_free_kho_radix_tree;
|
||||
}
|
||||
|
||||
err = kho_debugfs_init();
|
||||
|
|
@ -1702,9 +1729,8 @@ static __init int kho_init(void)
|
|||
|
||||
err_free_fdt:
|
||||
kho_unpreserve_free(kho_out.fdt);
|
||||
err_free_kho_radix_tree_root:
|
||||
kfree(tree->root);
|
||||
tree->root = NULL;
|
||||
err_free_kho_radix_tree:
|
||||
kho_radix_destroy_tree(tree);
|
||||
err_free_scratch:
|
||||
kho_out.fdt = NULL;
|
||||
for (int i = 0; i < kho_scratch_cnt; i++) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user