Skip to content

Commit

Permalink
radix tree: Remove radix_tree_update_node_t
Browse files Browse the repository at this point in the history
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: Matthew Wilcox <[email protected]>
  • Loading branch information
Matthew Wilcox committed Oct 21, 2018
1 parent a283348 commit 1cf56f9
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 42 deletions.
7 changes: 1 addition & 6 deletions include/linux/radix-tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 __rcu **radix_tree_lookup_slot(const struct radix_tree_root *,
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 __rcu **slot, void *entry,
radix_tree_update_node_t update_node);
void __rcu **slot, void *entry);
void radix_tree_iter_replace(struct radix_tree_root *,
const struct radix_tree_iter *, void __rcu **slot, void *entry);
void radix_tree_replace_slot(struct radix_tree_root *,
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 *,
struct radix_tree_iter *iter, void __rcu **slot);
void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
Expand Down
2 changes: 1 addition & 1 deletion lib/idr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
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;
}
Expand Down
42 changes: 8 additions & 34 deletions lib/radix-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
* @root radix tree root
*/
static inline bool radix_tree_shrink(struct radix_tree_root *root,
radix_tree_update_node_t update_node)
static inline bool radix_tree_shrink(struct radix_tree_root *root)
{
bool shrunk = false;

Expand Down Expand Up @@ -631,8 +630,6 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
node->count = 0;
if (!radix_tree_is_internal_node(child)) {
node->slots[0] = (void __rcu *)RADIX_TREE_RETRY;
if (update_node)
update_node(node);
}

WARN_ON_ONCE(!list_empty(&node->private_list));
Expand All @@ -644,8 +641,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root,
}

static bool delete_node(struct radix_tree_root *root,
struct radix_tree_node *node,
radix_tree_update_node_t update_node)
struct radix_tree_node *node)
{
bool deleted = false;

Expand All @@ -655,7 +651,7 @@ static bool delete_node(struct radix_tree_root *root,
if (node->count) {
if (node_to_entry(node) ==
rcu_dereference_raw(root->xa_head))
deleted |= radix_tree_shrink(root, update_node);
deleted |= radix_tree_shrink(root);
return deleted;
}

Expand Down Expand Up @@ -1059,15 +1055,13 @@ static int calculate_count(struct radix_tree_root *root,
* @node: pointer to tree node
* @slot: pointer to slot in @node
* @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
* across slot lookup and replacement.
*/
void __radix_tree_replace(struct radix_tree_root *root,
struct radix_tree_node *node,
void __rcu **slot, void *item,
radix_tree_update_node_t update_node)
void __rcu **slot, void *item)
{
void *old = rcu_dereference_raw(*slot);
int values = !!xa_is_value(item) - !!xa_is_value(old);
Expand All @@ -1085,10 +1079,7 @@ void __radix_tree_replace(struct radix_tree_root *root,
if (!node)
return;

if (update_node)
update_node(node);

delete_node(root, node, update_node);
delete_node(root, node);
}

/**
Expand All @@ -1110,7 +1101,7 @@ void __radix_tree_replace(struct radix_tree_root *root,
void radix_tree_replace_slot(struct radix_tree_root *root,
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);

Expand All @@ -1127,7 +1118,7 @@ void radix_tree_iter_replace(struct radix_tree_root *root,
const struct radix_tree_iter *iter,
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
Expand Down Expand Up @@ -1807,23 +1798,6 @@ radix_tree_gang_lookup_tag_slot(const struct radix_tree_root *root,
}
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,
struct radix_tree_node *node, void __rcu **slot)
{
Expand All @@ -1839,7 +1813,7 @@ static bool __radix_tree_delete(struct radix_tree_root *root,
node_tag_clear(root, node, tag, offset);

replace_slot(slot, NULL, node, -1, values);
return node && delete_node(root, node, NULL);
return node && delete_node(root, node);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion tools/testing/radix-tree/multiorder.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,7 @@ static void multiorder_account(void)
__radix_tree_insert(&tree, 1 << 5, 5, xa_mk_value(5));
__radix_tree_lookup(&tree, 1 << 5, &node, &slot);
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);

item_kill_tree(&tree);
Expand Down

0 comments on commit 1cf56f9

Please sign in to comment.