mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 14:41:27 +00:00
xarray: Step through an XArray
The xas_next and xas_prev functions move the xas index by one position, and adjust the rest of the iterator state to match it. This is more efficient than calling xas_set() as it keeps the iterator at the leaves of the tree instead of walking the iterator from the root each time. Signed-off-by: Matthew Wilcox <willy@infradead.org>
This commit is contained in:
parent
687149fca1
commit
64d3e9a9e0
3 changed files with 256 additions and 0 deletions
74
lib/xarray.c
74
lib/xarray.c
|
@ -876,6 +876,80 @@ void xas_pause(struct xa_state *xas)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(xas_pause);
|
||||
|
||||
/*
|
||||
* __xas_prev() - Find the previous entry in the XArray.
|
||||
* @xas: XArray operation state.
|
||||
*
|
||||
* Helper function for xas_prev() which handles all the complex cases
|
||||
* out of line.
|
||||
*/
|
||||
void *__xas_prev(struct xa_state *xas)
|
||||
{
|
||||
void *entry;
|
||||
|
||||
if (!xas_frozen(xas->xa_node))
|
||||
xas->xa_index--;
|
||||
if (xas_not_node(xas->xa_node))
|
||||
return xas_load(xas);
|
||||
|
||||
if (xas->xa_offset != get_offset(xas->xa_index, xas->xa_node))
|
||||
xas->xa_offset--;
|
||||
|
||||
while (xas->xa_offset == 255) {
|
||||
xas->xa_offset = xas->xa_node->offset - 1;
|
||||
xas->xa_node = xa_parent(xas->xa, xas->xa_node);
|
||||
if (!xas->xa_node)
|
||||
return set_bounds(xas);
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
|
||||
if (!xa_is_node(entry))
|
||||
return entry;
|
||||
|
||||
xas->xa_node = xa_to_node(entry);
|
||||
xas_set_offset(xas);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__xas_prev);
|
||||
|
||||
/*
|
||||
* __xas_next() - Find the next entry in the XArray.
|
||||
* @xas: XArray operation state.
|
||||
*
|
||||
* Helper function for xas_next() which handles all the complex cases
|
||||
* out of line.
|
||||
*/
|
||||
void *__xas_next(struct xa_state *xas)
|
||||
{
|
||||
void *entry;
|
||||
|
||||
if (!xas_frozen(xas->xa_node))
|
||||
xas->xa_index++;
|
||||
if (xas_not_node(xas->xa_node))
|
||||
return xas_load(xas);
|
||||
|
||||
if (xas->xa_offset != get_offset(xas->xa_index, xas->xa_node))
|
||||
xas->xa_offset++;
|
||||
|
||||
while (xas->xa_offset == XA_CHUNK_SIZE) {
|
||||
xas->xa_offset = xas->xa_node->offset + 1;
|
||||
xas->xa_node = xa_parent(xas->xa, xas->xa_node);
|
||||
if (!xas->xa_node)
|
||||
return set_bounds(xas);
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
|
||||
if (!xa_is_node(entry))
|
||||
return entry;
|
||||
|
||||
xas->xa_node = xa_to_node(entry);
|
||||
xas_set_offset(xas);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__xas_next);
|
||||
|
||||
/**
|
||||
* xas_find() - Find the next present entry in the XArray.
|
||||
* @xas: XArray operation state.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue