mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
kho: add data argument to radix walk callback
Add an opaque data pointer argument to kho_radix_walk_cb_t. This can be used by callers to pass extra information to the callback. Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com> Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org> Link: https://patch.msgid.link/20260801084833.1897543-10-pratyush@kernel.org Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
This commit is contained in:
parent
88b2bdbbf7
commit
8f1c8d4cf8
|
|
@ -48,8 +48,8 @@ struct kho_radix_tree {
|
|||
* return value is directly returned to the caller.
|
||||
*/
|
||||
struct kho_radix_walk_cb {
|
||||
int (*leaf)(unsigned long key);
|
||||
int (*node)(phys_addr_t phys);
|
||||
int (*leaf)(unsigned long key, void *data);
|
||||
int (*node)(phys_addr_t phys, void *data);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_KEXEC_HANDOVER
|
||||
|
|
@ -57,7 +57,7 @@ struct kho_radix_walk_cb {
|
|||
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);
|
||||
const struct kho_radix_walk_cb *cb, void *data);
|
||||
|
||||
#else /* #ifdef CONFIG_KEXEC_HANDOVER */
|
||||
|
||||
|
|
@ -70,7 +70,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,
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
const struct kho_radix_walk_cb *cb, void *data)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -282,14 +282,14 @@ 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,
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
const struct kho_radix_walk_cb *cb, void *data)
|
||||
{
|
||||
unsigned long *bitmap = (unsigned long *)leaf;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
if (cb->node) {
|
||||
err = cb->node(virt_to_phys(leaf));
|
||||
err = cb->node(virt_to_phys(leaf), data);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
|
@ -298,7 +298,7 @@ static int kho_radix_walk_leaf(struct kho_radix_leaf *leaf, unsigned long key,
|
|||
return 0;
|
||||
|
||||
for_each_set_bit(i, bitmap, PAGE_SIZE * BITS_PER_BYTE) {
|
||||
err = cb->leaf(key | i);
|
||||
err = cb->leaf(key | i, data);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
|
@ -308,7 +308,7 @@ static int kho_radix_walk_leaf(struct kho_radix_leaf *leaf, unsigned long key,
|
|||
|
||||
static int __kho_radix_walk_tree(struct kho_radix_node *root,
|
||||
unsigned int level, unsigned long start,
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
const struct kho_radix_walk_cb *cb, void *data)
|
||||
{
|
||||
struct kho_radix_node *node;
|
||||
struct kho_radix_leaf *leaf;
|
||||
|
|
@ -317,7 +317,7 @@ static int __kho_radix_walk_tree(struct kho_radix_node *root,
|
|||
int err;
|
||||
|
||||
if (cb->node) {
|
||||
err = cb->node(virt_to_phys(root));
|
||||
err = cb->node(virt_to_phys(root), data);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
|
@ -338,10 +338,10 @@ static int __kho_radix_walk_tree(struct kho_radix_node *root,
|
|||
* node is pointing to the level 0 bitmap.
|
||||
*/
|
||||
leaf = (struct kho_radix_leaf *)node;
|
||||
err = kho_radix_walk_leaf(leaf, key, cb);
|
||||
err = kho_radix_walk_leaf(leaf, key, cb, data);
|
||||
} else {
|
||||
err = __kho_radix_walk_tree(node, level - 1,
|
||||
key, cb);
|
||||
key, cb, data);
|
||||
}
|
||||
|
||||
if (err)
|
||||
|
|
@ -355,6 +355,7 @@ 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: Set of callbacks to be invoked during the tree walk.
|
||||
* @data: Opaque data pointer passed to each callback in @cb.
|
||||
*
|
||||
* This function walks the radix tree, searching from the top level down to the
|
||||
* lowest level (level 0), invoking the appropriate callbacks.
|
||||
|
|
@ -363,14 +364,15 @@ static int __kho_radix_walk_tree(struct kho_radix_node *root,
|
|||
* value from the callback that stopped the walk.
|
||||
*/
|
||||
int kho_radix_walk_tree(struct kho_radix_tree *tree,
|
||||
const struct kho_radix_walk_cb *cb)
|
||||
const struct kho_radix_walk_cb *cb, void *data)
|
||||
{
|
||||
if (WARN_ON_ONCE(!tree->root))
|
||||
return -EINVAL;
|
||||
|
||||
guard(mutex)(&tree->lock);
|
||||
|
||||
return __kho_radix_walk_tree(tree->root, KHO_TREE_MAX_DEPTH - 1, 0, cb);
|
||||
return __kho_radix_walk_tree(tree->root, KHO_TREE_MAX_DEPTH - 1, 0, cb,
|
||||
data);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kho_radix_walk_tree);
|
||||
|
||||
|
|
@ -501,7 +503,7 @@ static struct page *__init kho_get_preserved_page(phys_addr_t phys,
|
|||
return pfn_to_page(pfn);
|
||||
}
|
||||
|
||||
static int __init kho_preserved_memory_reserve(unsigned long key)
|
||||
static int __init kho_preserved_memory_reserve(unsigned long key, void *data)
|
||||
{
|
||||
union kho_page_info info;
|
||||
struct page *page;
|
||||
|
|
@ -1451,7 +1453,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, &cb);
|
||||
err = kho_radix_walk_tree(&kho_in.radix_tree, &cb, NULL);
|
||||
if (err) {
|
||||
/*
|
||||
* Failed to initialize preserved memory. Clear FDT and radix
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user