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: Matthew Wilcox <willy@infradead.org>
This commit is contained in:
parent
a283348629
commit
1cf56f9d67
|
@ -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)
|
||||||
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 @@ out:
|
||||||
* 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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
* @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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
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,
|
||||||
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)
|
||||||
__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);
|
||||||
|
|
Loading…
Reference in New Issue