mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
rbtree: optimize fetching of sibling node
When looking to fetch a node's sibling, we went through a sequence of: - check if node is the parent's left child - if it is, then fetch the parent's right child This can be replaced with: - fetch the parent's right child as an assumed sibling - check that node is NOT the fetched child This avoids fetching the parent's left child when node is actually that child. Saves a bit on code size, though it doesn't seem to make a large difference in speed. Signed-off-by: Michel Lespinasse <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: David Woodhouse <[email protected]> Acked-by: Rik van Riel <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Daniel Santos <[email protected]> Cc: Jens Axboe <[email protected]> Cc: "Eric W. Biederman" <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
7ce6ff9e5d
commit
59633abf34
1 changed files with 13 additions and 8 deletions
21
lib/rbtree.c
21
lib/rbtree.c
|
|
@ -107,8 +107,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
|
|||
|
||||
gparent = rb_red_parent(parent);
|
||||
|
||||
if (parent == gparent->rb_left) {
|
||||
tmp = gparent->rb_right;
|
||||
tmp = gparent->rb_right;
|
||||
if (parent != tmp) { /* parent == gparent->rb_left */
|
||||
if (tmp && rb_is_red(tmp)) {
|
||||
/*
|
||||
* Case 1 - color flips
|
||||
|
|
@ -131,7 +131,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (parent->rb_right == node) {
|
||||
tmp = parent->rb_right;
|
||||
if (node == tmp) {
|
||||
/*
|
||||
* Case 2 - left rotate at parent
|
||||
*
|
||||
|
|
@ -151,6 +152,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
|
|||
RB_BLACK);
|
||||
rb_set_parent_color(parent, node, RB_RED);
|
||||
parent = node;
|
||||
tmp = node->rb_right;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -162,7 +164,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
|
|||
* / \
|
||||
* n U
|
||||
*/
|
||||
gparent->rb_left = tmp = parent->rb_right;
|
||||
gparent->rb_left = tmp; /* == parent->rb_right */
|
||||
parent->rb_right = gparent;
|
||||
if (tmp)
|
||||
rb_set_parent_color(tmp, gparent, RB_BLACK);
|
||||
|
|
@ -180,7 +182,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (parent->rb_left == node) {
|
||||
tmp = parent->rb_left;
|
||||
if (node == tmp) {
|
||||
/* Case 2 - right rotate at parent */
|
||||
parent->rb_left = tmp = node->rb_right;
|
||||
node->rb_right = parent;
|
||||
|
|
@ -189,10 +192,11 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
|
|||
RB_BLACK);
|
||||
rb_set_parent_color(parent, node, RB_RED);
|
||||
parent = node;
|
||||
tmp = node->rb_left;
|
||||
}
|
||||
|
||||
/* Case 3 - left rotate at gparent */
|
||||
gparent->rb_right = tmp = parent->rb_left;
|
||||
gparent->rb_right = tmp; /* == parent->rb_left */
|
||||
parent->rb_left = gparent;
|
||||
if (tmp)
|
||||
rb_set_parent_color(tmp, gparent, RB_BLACK);
|
||||
|
|
@ -223,8 +227,9 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
|
|||
break;
|
||||
} else if (!parent) {
|
||||
break;
|
||||
} else if (parent->rb_left == node) {
|
||||
sibling = parent->rb_right;
|
||||
}
|
||||
sibling = parent->rb_right;
|
||||
if (node != sibling) { /* node == parent->rb_left */
|
||||
if (rb_is_red(sibling)) {
|
||||
/*
|
||||
* Case 1 - left rotate at parent
|
||||
|
|
|
|||
Loading…
Reference in a new issue