mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 07:31:41 +00:00
rbtree: remove prior augmented rbtree implementation
convert arch/x86/mm/pat_rbtree.c to the proposed augmented rbtree api and remove the old augmented rbtree implementation. Signed-off-by: Michel Lespinasse <walken@google.com> Acked-by: Rik van Riel <riel@redhat.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
14b94af0b2
commit
9d9e6f9703
3 changed files with 46 additions and 98 deletions
71
lib/rbtree.c
71
lib/rbtree.c
|
@ -538,77 +538,6 @@ void rb_erase_augmented(struct rb_node *node, struct rb_root *root,
|
|||
}
|
||||
EXPORT_SYMBOL(rb_erase_augmented);
|
||||
|
||||
static void rb_augment_path(struct rb_node *node, rb_augment_f func, void *data)
|
||||
{
|
||||
struct rb_node *parent;
|
||||
|
||||
up:
|
||||
func(node, data);
|
||||
parent = rb_parent(node);
|
||||
if (!parent)
|
||||
return;
|
||||
|
||||
if (node == parent->rb_left && parent->rb_right)
|
||||
func(parent->rb_right, data);
|
||||
else if (parent->rb_left)
|
||||
func(parent->rb_left, data);
|
||||
|
||||
node = parent;
|
||||
goto up;
|
||||
}
|
||||
|
||||
/*
|
||||
* after inserting @node into the tree, update the tree to account for
|
||||
* both the new entry and any damage done by rebalance
|
||||
*/
|
||||
void rb_augment_insert(struct rb_node *node, rb_augment_f func, void *data)
|
||||
{
|
||||
if (node->rb_left)
|
||||
node = node->rb_left;
|
||||
else if (node->rb_right)
|
||||
node = node->rb_right;
|
||||
|
||||
rb_augment_path(node, func, data);
|
||||
}
|
||||
EXPORT_SYMBOL(rb_augment_insert);
|
||||
|
||||
/*
|
||||
* before removing the node, find the deepest node on the rebalance path
|
||||
* that will still be there after @node gets removed
|
||||
*/
|
||||
struct rb_node *rb_augment_erase_begin(struct rb_node *node)
|
||||
{
|
||||
struct rb_node *deepest;
|
||||
|
||||
if (!node->rb_right && !node->rb_left)
|
||||
deepest = rb_parent(node);
|
||||
else if (!node->rb_right)
|
||||
deepest = node->rb_left;
|
||||
else if (!node->rb_left)
|
||||
deepest = node->rb_right;
|
||||
else {
|
||||
deepest = rb_next(node);
|
||||
if (deepest->rb_right)
|
||||
deepest = deepest->rb_right;
|
||||
else if (rb_parent(deepest) != node)
|
||||
deepest = rb_parent(deepest);
|
||||
}
|
||||
|
||||
return deepest;
|
||||
}
|
||||
EXPORT_SYMBOL(rb_augment_erase_begin);
|
||||
|
||||
/*
|
||||
* after removal, update the tree to account for the removed entry
|
||||
* and any rebalance damage.
|
||||
*/
|
||||
void rb_augment_erase_end(struct rb_node *node, rb_augment_f func, void *data)
|
||||
{
|
||||
if (node)
|
||||
rb_augment_path(node, func, data);
|
||||
}
|
||||
EXPORT_SYMBOL(rb_augment_erase_end);
|
||||
|
||||
/*
|
||||
* This function returns the first node (in sort order) of the tree.
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue