radix-tree: add radix_tree_gang_lookup_index
Add radix_tree_gang_lookup_index to get the radix tree indices along with the pointers. This will be helpful, for e.g. if a radix_tree_delete has to be performed depending on one of the result values. Change-Id: Iab83d027968462aa30da5341fa3f60134b6c1137 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
This commit is contained in:
parent
347c419ead
commit
6fe144923f
2 changed files with 47 additions and 0 deletions
|
@ -274,6 +274,10 @@ void *radix_tree_delete(struct radix_tree_root *, unsigned long);
|
||||||
unsigned int
|
unsigned int
|
||||||
radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
|
radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
|
||||||
unsigned long first_index, unsigned int max_items);
|
unsigned long first_index, unsigned int max_items);
|
||||||
|
unsigned int
|
||||||
|
radix_tree_gang_lookup_index(struct radix_tree_root *root, void **results,
|
||||||
|
unsigned long *indices, unsigned long first_index,
|
||||||
|
unsigned int max_items);
|
||||||
unsigned int radix_tree_gang_lookup_slot(struct radix_tree_root *root,
|
unsigned int radix_tree_gang_lookup_slot(struct radix_tree_root *root,
|
||||||
void ***results, unsigned long *indices,
|
void ***results, unsigned long *indices,
|
||||||
unsigned long first_index, unsigned int max_items);
|
unsigned long first_index, unsigned int max_items);
|
||||||
|
|
|
@ -1034,6 +1034,49 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(radix_tree_gang_lookup);
|
EXPORT_SYMBOL(radix_tree_gang_lookup);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* radix_tree_gang_lookup_index - perform multiple lookup on a radix tree
|
||||||
|
* @root: radix tree root
|
||||||
|
* @results: where the results of the lookup are placed
|
||||||
|
* @indices: where their indices should be placed
|
||||||
|
* @first_index: start the lookup from this key
|
||||||
|
* @max_items: place up to this many items at *results
|
||||||
|
*
|
||||||
|
* Performs an index-ascending scan of the tree for present items. Places
|
||||||
|
* them at *@results and returns the number of items which were placed at
|
||||||
|
* *@results. The indices are placed in @indices.
|
||||||
|
*
|
||||||
|
* The implementation is naive.
|
||||||
|
*
|
||||||
|
* Just one difference from radix_tree_gang_lookup, the indices are also
|
||||||
|
* collected along with the results of lookup.
|
||||||
|
*/
|
||||||
|
unsigned int
|
||||||
|
radix_tree_gang_lookup_index(struct radix_tree_root *root, void **results,
|
||||||
|
unsigned long *indices, unsigned long first_index,
|
||||||
|
unsigned int max_items)
|
||||||
|
{
|
||||||
|
struct radix_tree_iter iter;
|
||||||
|
void **slot;
|
||||||
|
unsigned int ret = 0;
|
||||||
|
|
||||||
|
if (unlikely(!max_items))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
radix_tree_for_each_slot(slot, root, &iter, first_index) {
|
||||||
|
results[ret] = indirect_to_ptr(rcu_dereference_raw(*slot));
|
||||||
|
if (!results[ret])
|
||||||
|
continue;
|
||||||
|
if (indices)
|
||||||
|
indices[ret] = iter.index;
|
||||||
|
if (++ret == max_items)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(radix_tree_gang_lookup_index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* radix_tree_gang_lookup_slot - perform multiple slot lookup on radix tree
|
* radix_tree_gang_lookup_slot - perform multiple slot lookup on radix tree
|
||||||
* @root: radix tree root
|
* @root: radix tree root
|
||||||
|
|
Loading…
Add table
Reference in a new issue