Skip to content

Commit

Permalink
XArray: Add xas_advance()
Browse files Browse the repository at this point in the history
Add a new helper function to help iterate over multi-index entries.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
  • Loading branch information
Matthew Wilcox (Oracle) committed Jan 8, 2022
1 parent b9a8a41 commit 25a8de7
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
18 changes: 18 additions & 0 deletions include/linux/xarray.h
Original file line number Diff line number Diff line change
Expand Up @@ -1580,6 +1580,24 @@ static inline void xas_set(struct xa_state *xas, unsigned long index)
xas->xa_node = XAS_RESTART;
}

/**
* xas_advance() - Skip over sibling entries.
* @xas: XArray operation state.
* @index: Index of last sibling entry.
*
* Move the operation state to refer to the last sibling entry.
* This is useful for loops that normally want to see sibling
* entries but sometimes want to skip them. Use xas_set() if you
* want to move to an index which is not part of this entry.
*/
static inline void xas_advance(struct xa_state *xas, unsigned long index)
{
unsigned char shift = xas_is_node(xas) ? xas->xa_node->shift : 0;

xas->xa_index = index;
xas->xa_offset = (index >> shift) & XA_CHUNK_MASK;
}

/**
* xas_set_order() - Set up XArray operation state for a multislot entry.
* @xas: XArray operation state.
Expand Down
6 changes: 3 additions & 3 deletions lib/xarray.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ static void xas_move_index(struct xa_state *xas, unsigned long offset)
xas->xa_index += offset << shift;
}

static void xas_advance(struct xa_state *xas)
static void xas_next_offset(struct xa_state *xas)
{
xas->xa_offset++;
xas_move_index(xas, xas->xa_offset);
Expand Down Expand Up @@ -1250,7 +1250,7 @@ void *xas_find(struct xa_state *xas, unsigned long max)
xas->xa_offset = ((xas->xa_index - 1) & XA_CHUNK_MASK) + 1;
}

xas_advance(xas);
xas_next_offset(xas);

while (xas->xa_node && (xas->xa_index <= max)) {
if (unlikely(xas->xa_offset == XA_CHUNK_SIZE)) {
Expand All @@ -1268,7 +1268,7 @@ void *xas_find(struct xa_state *xas, unsigned long max)
if (entry && !xa_is_sibling(entry))
return entry;

xas_advance(xas);
xas_next_offset(xas);
}

if (!xas->xa_node)
Expand Down

0 comments on commit 25a8de7

Please sign in to comment.