mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
kho: add a struct for radix callbacks
A future commit will add more callbacks for the KHO radix tree. Add a struct for collecting the callbacks. Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org> Link: https://patch.msgid.link/20260801084833.1897543-8-pratyush@kernel.org Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
This commit is contained in:
parent
e9e4ecd4b7
commit
64c48113b3
|
|
@ -38,14 +38,23 @@ struct kho_radix_tree {
|
|||
struct mutex lock; /* protects the tree's structure and root pointer */
|
||||
};
|
||||
|
||||
typedef int (*kho_radix_tree_walk_callback_t)(unsigned long key);
|
||||
/**
|
||||
* struct kho_radix_walk_cb - Callbacks for KHO radix tree walk.
|
||||
* @leaf: Called on each present key in the radix tree.
|
||||
*
|
||||
* For each callback, a return value of 0 continues the walk and a non-zero
|
||||
* return value is directly returned to the caller.
|
||||
*/
|
||||
struct kho_radix_walk_cb {
|
||||
int (*leaf)(unsigned long key);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_KEXEC_HANDOVER
|
||||
|
||||
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,
|
||||
kho_radix_tree_walk_callback_t cb);
|
||||
const struct kho_radix_walk_cb *cb);
|
||||
|
||||
#else /* #ifdef CONFIG_KEXEC_HANDOVER */
|
||||
|
||||
|
|
@ -58,7 +67,7 @@ static inline void kho_radix_del_key(struct kho_radix_tree *tree,
|
|||
unsigned long key) { }
|
||||
|
||||
static inline int kho_radix_walk_tree(struct kho_radix_tree *tree,
|
||||
kho_radix_tree_walk_callback_t cb)
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -281,16 +281,18 @@ void kho_radix_del_key(struct kho_radix_tree *tree, unsigned long key)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(kho_radix_del_key);
|
||||
|
||||
static int kho_radix_walk_leaf(struct kho_radix_leaf *leaf,
|
||||
unsigned long key,
|
||||
kho_radix_tree_walk_callback_t cb)
|
||||
static int kho_radix_walk_leaf(struct kho_radix_leaf *leaf, unsigned long key,
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
{
|
||||
unsigned long *bitmap = (unsigned long *)leaf;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
if (!cb->leaf)
|
||||
return 0;
|
||||
|
||||
for_each_set_bit(i, bitmap, PAGE_SIZE * BITS_PER_BYTE) {
|
||||
err = cb(key | i);
|
||||
err = cb->leaf(key | i);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
|
@ -300,7 +302,7 @@ static int kho_radix_walk_leaf(struct kho_radix_leaf *leaf,
|
|||
|
||||
static int __kho_radix_walk_tree(struct kho_radix_node *root,
|
||||
unsigned int level, unsigned long start,
|
||||
kho_radix_tree_walk_callback_t cb)
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
{
|
||||
struct kho_radix_node *node;
|
||||
struct kho_radix_leaf *leaf;
|
||||
|
|
@ -340,18 +342,16 @@ static int __kho_radix_walk_tree(struct kho_radix_node *root,
|
|||
/**
|
||||
* kho_radix_walk_tree - Traverses the radix tree and calls a callback for each key.
|
||||
* @tree: A pointer to the KHO radix tree to walk.
|
||||
* @cb: A callback function of type kho_radix_tree_walk_callback_t that will be
|
||||
* invoked for each key in the tree.
|
||||
* @cb: Set of callbacks to be invoked during the tree walk.
|
||||
*
|
||||
* This function walks the radix tree, searching from the specified top level
|
||||
* down to the lowest level (level 0). For each key found, it invokes the
|
||||
* provided callback.
|
||||
* This function walks the radix tree, searching from the top level down to the
|
||||
* lowest level (level 0), invoking the appropriate callbacks.
|
||||
*
|
||||
* Return: 0 if the walk completed the specified tree, or the non-zero return
|
||||
* value from the callback that stopped the walk.
|
||||
*/
|
||||
int kho_radix_walk_tree(struct kho_radix_tree *tree,
|
||||
kho_radix_tree_walk_callback_t cb)
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
{
|
||||
if (WARN_ON_ONCE(!tree->root))
|
||||
return -EINVAL;
|
||||
|
|
@ -1419,6 +1419,9 @@ EXPORT_SYMBOL_GPL(kho_retrieve_subtree);
|
|||
|
||||
static void __init kho_mem_retrieve(void)
|
||||
{
|
||||
const struct kho_radix_walk_cb cb = {
|
||||
.leaf = kho_preserved_memory_reserve,
|
||||
};
|
||||
const void *fdt = kho_get_fdt();
|
||||
void *mem_map = kho_get_mem_map(fdt);
|
||||
int err;
|
||||
|
|
@ -1436,7 +1439,7 @@ static void __init kho_mem_retrieve(void)
|
|||
kho_in.radix_tree.root = mem_map;
|
||||
mutex_init(&kho_in.radix_tree.lock);
|
||||
|
||||
err = kho_radix_walk_tree(&kho_in.radix_tree, kho_preserved_memory_reserve);
|
||||
err = kho_radix_walk_tree(&kho_in.radix_tree, &cb);
|
||||
if (err) {
|
||||
/*
|
||||
* Failed to initialize preserved memory. Clear FDT and radix
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user