Commit 1cf56f9d authored by Matthew Wilcox's avatar Matthew Wilcox

radix tree: Remove radix_tree_update_node_t

The only user of this functionality was the workingset code, and it's
now been converted to the XArray.  Remove __radix_tree_delete_node()
entirely as it was also only used by the workingset code.
Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
parent a2833486
...@@ -242,17 +242,12 @@ void *__radix_tree_lookup(const struct radix_tree_root *, unsigned long index, ...@@ -242,17 +242,12 @@ void *__radix_tree_lookup(const struct radix_tree_root *, unsigned long index,
void *radix_tree_lookup(const struct radix_tree_root *, unsigned long); void *radix_tree_lookup(const struct radix_tree_root *, unsigned long);
void __rcu **radix_tree_lookup_slot(const struct radix_tree_root *, void __rcu **radix_tree_lookup_slot(const struct radix_tree_root *,
unsigned long index); unsigned long index);
typedef void (*radix_tree_update_node_t)(struct radix_tree_node *);
void __radix_tree_replace(struct radix_tree_root *, struct radix_tree_node *, void __radix_tree_replace(struct radix_tree_root *, struct radix_tree_node *,
void __rcu **slot, void *entry, void __rcu **slot, void *entry);
radix_tree_update_node_t update_node);
void radix_tree_iter_replace(struct radix_tree_root *, void radix_tree_iter_replace(struct radix_tree_root *,
const struct radix_tree_iter *, void __rcu **slot, void *entry); const struct radix_tree_iter *, void __rcu **slot, void *entry);
void radix_tree_replace_slot(struct radix_tree_root *, void radix_tree_replace_slot(struct radix_tree_root *,
void __rcu **slot, void *entry); void __rcu **slot, void *entry);
void __radix_tree_delete_node(struct radix_tree_root *,
struct radix_tree_node *,
radix_tree_update_node_t update_node);
void radix_tree_iter_delete(struct radix_tree_root *, void radix_tree_iter_delete(struct radix_tree_root *,
struct radix_tree_iter *iter, void __rcu **slot); struct radix_tree_iter *iter, void __rcu **slot);
void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *); void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
......
...@@ -297,7 +297,7 @@ void *idr_replace(struct idr *idr, void *ptr, unsigned long id) ...@@ -297,7 +297,7 @@ void *idr_replace(struct idr *idr, void *ptr, unsigned long id)
if (!slot || radix_tree_tag_get(&idr->idr_rt, id, IDR_FREE)) if (!slot || radix_tree_tag_get(&idr->idr_rt, id, IDR_FREE))
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
__radix_tree_replace(&idr->idr_rt, node, slot, ptr, NULL); __radix_tree_replace(&idr->idr_rt, node, slot, ptr);
return entry; return entry;
} }
......
...@@ -562,8 +562,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp, ...@@ -562,8 +562,7 @@ static int radix_tree_extend(struct radix_tree_root *root, gfp_t gfp,
* radix_tree_shrink - shrink radix tree to minimum height * radix_tree_shrink - shrink radix tree to minimum height
* @root radix tree root * @root radix tree root
*/ */
static inline bool radix_tree_shrink(struct radix_tree_root *root, static inline bool radix_tree_shrink(struct radix_tree_root *root)
radix_tree_update_node_t update_node)
{ {
bool shrunk = false; bool shrunk = false;
...@@ -631,8 +630,6 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root, ...@@ -631,8 +630,6 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
node->count = 0; node->count = 0;
if (!radix_tree_is_internal_node(child)) { if (!radix_tree_is_internal_node(child)) {
node->slots[0] = (void __rcu *)RADIX_TREE_RETRY; node->slots[0] = (void __rcu *)RADIX_TREE_RETRY;
if (update_node)
update_node(node);
} }
WARN_ON_ONCE(!list_empty(&node->private_list)); WARN_ON_ONCE(!list_empty(&node->private_list));
...@@ -644,8 +641,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root, ...@@ -644,8 +641,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
} }
static bool delete_node(struct radix_tree_root *root, static bool delete_node(struct radix_tree_root *root,
struct radix_tree_node *node, struct radix_tree_node *node)
radix_tree_update_node_t update_node)
{ {
bool deleted = false; bool deleted = false;
...@@ -655,7 +651,7 @@ static bool delete_node(struct radix_tree_root *root, ...@@ -655,7 +651,7 @@ static bool delete_node(struct radix_tree_root *root,
if (node->count) { if (node->count) {
if (node_to_entry(node) == if (node_to_entry(node) ==
rcu_dereference_raw(root->xa_head)) rcu_dereference_raw(root->xa_head))
deleted |= radix_tree_shrink(root, update_node); deleted |= radix_tree_shrink(root);
return deleted; return deleted;
} }
...@@ -1059,15 +1055,13 @@ static int calculate_count(struct radix_tree_root *root, ...@@ -1059,15 +1055,13 @@ static int calculate_count(struct radix_tree_root *root,
* @node: pointer to tree node * @node: pointer to tree node
* @slot: pointer to slot in @node * @slot: pointer to slot in @node
* @item: new item to store in the slot. * @item: new item to store in the slot.
* @update_node: callback for changing leaf nodes
* *
* For use with __radix_tree_lookup(). Caller must hold tree write locked * For use with __radix_tree_lookup(). Caller must hold tree write locked
* across slot lookup and replacement. * across slot lookup and replacement.
*/ */
void __radix_tree_replace(struct radix_tree_root *root, void __radix_tree_replace(struct radix_tree_root *root,
struct radix_tree_node *node, struct radix_tree_node *node,
void __rcu **slot, void *item, void __rcu **slot, void *item)
radix_tree_update_node_t update_node)
{ {
void *old = rcu_dereference_raw(*slot); void *old = rcu_dereference_raw(*slot);
int values = !!xa_is_value(item) - !!xa_is_value(old); int values = !!xa_is_value(item) - !!xa_is_value(old);
...@@ -1085,10 +1079,7 @@ void __radix_tree_replace(struct radix_tree_root *root, ...@@ -1085,10 +1079,7 @@ void __radix_tree_replace(struct radix_tree_root *root,
if (!node) if (!node)
return; return;
if (update_node) delete_node(root, node);
update_node(node);
delete_node(root, node, update_node);
} }
/** /**
...@@ -1110,7 +1101,7 @@ void __radix_tree_replace(struct radix_tree_root *root, ...@@ -1110,7 +1101,7 @@ void __radix_tree_replace(struct radix_tree_root *root,
void radix_tree_replace_slot(struct radix_tree_root *root, void radix_tree_replace_slot(struct radix_tree_root *root,
void __rcu **slot, void *item) void __rcu **slot, void *item)
{ {
__radix_tree_replace(root, NULL, slot, item, NULL); __radix_tree_replace(root, NULL, slot, item);
} }
EXPORT_SYMBOL(radix_tree_replace_slot); EXPORT_SYMBOL(radix_tree_replace_slot);
...@@ -1127,7 +1118,7 @@ void radix_tree_iter_replace(struct radix_tree_root *root, ...@@ -1127,7 +1118,7 @@ void radix_tree_iter_replace(struct radix_tree_root *root,
const struct radix_tree_iter *iter, const struct radix_tree_iter *iter,
void __rcu **slot, void *item) void __rcu **slot, void *item)
{ {
__radix_tree_replace(root, iter->node, slot, item, NULL); __radix_tree_replace(root, iter->node, slot, item);
} }
#ifdef CONFIG_RADIX_TREE_MULTIORDER #ifdef CONFIG_RADIX_TREE_MULTIORDER
...@@ -1807,23 +1798,6 @@ radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *root, ...@@ -1807,23 +1798,6 @@ radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *root,
} }
EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot); EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot);
/**
* __radix_tree_delete_node - try to free node after clearing a slot
* @root: radix tree root
* @node: node containing @index
* @update_node: callback for changing leaf nodes
*
* After clearing the slot at @index in @node from radix tree
* rooted at @root, call this function to attempt freeing the
* node and shrinking the tree.
*/
void __radix_tree_delete_node(struct radix_tree_root *root,
struct radix_tree_node *node,
radix_tree_update_node_t update_node)
{
delete_node(root, node, update_node);
}
static bool __radix_tree_delete(struct radix_tree_root *root, static bool __radix_tree_delete(struct radix_tree_root *root,
struct radix_tree_node *node, void __rcu **slot) struct radix_tree_node *node, void __rcu **slot)
{ {
...@@ -1839,7 +1813,7 @@ static bool __radix_tree_delete(struct radix_tree_root *root, ...@@ -1839,7 +1813,7 @@ static bool __radix_tree_delete(struct radix_tree_root *root,
node_tag_clear(root, node, tag, offset); node_tag_clear(root, node, tag, offset);
replace_slot(slot, NULL, node, -1, values); replace_slot(slot, NULL, node, -1, values);
return node && delete_node(root, node, NULL); return node && delete_node(root, node);
} }
/** /**
......
...@@ -618,7 +618,7 @@ static void multiorder_account(void) ...@@ -618,7 +618,7 @@ static void multiorder_account(void)
__radix_tree_insert(&tree, 1 << 5, 5, xa_mk_value(5)); __radix_tree_insert(&tree, 1 << 5, 5, xa_mk_value(5));
__radix_tree_lookup(&tree, 1 << 5, &node, &slot); __radix_tree_lookup(&tree, 1 << 5, &node, &slot);
assert(node->count == node->nr_values * 2); assert(node->count == node->nr_values * 2);
__radix_tree_replace(&tree, node, slot, NULL, NULL); __radix_tree_replace(&tree, node, slot, NULL);
assert(node->nr_values == 0); assert(node->nr_values == 0);
item_kill_tree(&tree); item_kill_tree(&tree);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment