diff options
| author | Matthew Wilcox (Oracle) <willy@infradead.org> | 2020-08-18 09:05:56 -0400 |
|---|---|---|
| committer | Matthew Wilcox (Oracle) <willy@infradead.org> | 2020-10-13 08:41:26 -0400 |
| commit | f82cd2f0b5eb715b1a296e20b34da7d296b6e9a4 (patch) | |
| tree | d932395ef576740b64fc24e9be268fe00ecbc56a /lib | |
| parent | 8446466c9dd645da4c1848f35ffd0fc1df3524ee (diff) | |
| download | net-f82cd2f0b5eb715b1a296e20b34da7d296b6e9a4.tar.gz | |
XArray: Add private interface for workingset node deletion
Move the tricky bits of dealing with the XArray from the workingset
code to the XArray. Make it clear in the documentation that this is a
private interface, and only export it for the benefit of the test suite.
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/test_xarray.c | 7 | ||||
| -rw-r--r-- | lib/xarray.c | 23 |
2 files changed, 24 insertions, 6 deletions
diff --git a/lib/test_xarray.c b/lib/test_xarray.c index 1122c4453c87dc..64ae07b1bcf4d3 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c @@ -1600,14 +1600,9 @@ static noinline void shadow_remove(struct xarray *xa) xa_lock(xa); while ((node = list_first_entry_or_null(&shadow_nodes, struct xa_node, private_list))) { - XA_STATE(xas, node->array, 0); XA_BUG_ON(xa, node->array != xa); list_del_init(&node->private_list); - xas.xa_node = xa_parent_locked(node->array, node); - xas.xa_offset = node->offset; - xas.xa_shift = node->shift + XA_CHUNK_SHIFT; - xas_set_update(&xas, test_update_node); - xas_store(&xas, NULL); + xa_delete_node(node, test_update_node); } xa_unlock(xa); } diff --git a/lib/xarray.c b/lib/xarray.c index e9e641d3c0c31b..1fa5c5658e6383 100644 --- a/lib/xarray.c +++ b/lib/xarray.c @@ -1974,6 +1974,29 @@ unsigned int xa_extract(struct xarray *xa, void **dst, unsigned long start, EXPORT_SYMBOL(xa_extract); /** + * xa_delete_node() - Private interface for workingset code. + * @node: Node to be removed from the tree. + * @update: Function to call to update ancestor nodes. + * + * Context: xa_lock must be held on entry and will not be released. + */ +void xa_delete_node(struct xa_node *node, xa_update_node_t update) +{ + struct xa_state xas = { + .xa = node->array, + .xa_index = (unsigned long)node->offset << + (node->shift + XA_CHUNK_SHIFT), + .xa_shift = node->shift + XA_CHUNK_SHIFT, + .xa_offset = node->offset, + .xa_node = xa_parent_locked(node->array, node), + .xa_update = update, + }; + + xas_store(&xas, NULL); +} +EXPORT_SYMBOL_GPL(xa_delete_node); /* For the benefit of the test suite */ + +/** * xa_destroy() - Free all internal data structures. * @xa: XArray. * |
