Commit 59633abf authored by Michel Lespinasse's avatar Michel Lespinasse Committed by Linus Torvalds

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: default avatarMichel Lespinasse <walken@google.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: David Woodhouse <David.Woodhouse@intel.com>
Acked-by: default avatarRik van Riel <riel@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Daniel Santos <daniel.santos@pobox.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7ce6ff9e
...@@ -107,8 +107,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) ...@@ -107,8 +107,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
gparent = rb_red_parent(parent); 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)) { if (tmp && rb_is_red(tmp)) {
/* /*
* Case 1 - color flips * Case 1 - color flips
...@@ -131,7 +131,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) ...@@ -131,7 +131,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
continue; continue;
} }
if (parent->rb_right == node) { tmp = parent->rb_right;
if (node == tmp) {
/* /*
* Case 2 - left rotate at parent * Case 2 - left rotate at parent
* *
...@@ -151,6 +152,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) ...@@ -151,6 +152,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
RB_BLACK); RB_BLACK);
rb_set_parent_color(parent, node, RB_RED); rb_set_parent_color(parent, node, RB_RED);
parent = node; parent = node;
tmp = node->rb_right;
} }
/* /*
...@@ -162,7 +164,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) ...@@ -162,7 +164,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
* / \ * / \
* n U * n U
*/ */
gparent->rb_left = tmp = parent->rb_right; gparent->rb_left = tmp; /* == parent->rb_right */
parent->rb_right = gparent; parent->rb_right = gparent;
if (tmp) if (tmp)
rb_set_parent_color(tmp, gparent, RB_BLACK); rb_set_parent_color(tmp, gparent, RB_BLACK);
...@@ -180,7 +182,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) ...@@ -180,7 +182,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
continue; continue;
} }
if (parent->rb_left == node) { tmp = parent->rb_left;
if (node == tmp) {
/* Case 2 - right rotate at parent */ /* Case 2 - right rotate at parent */
parent->rb_left = tmp = node->rb_right; parent->rb_left = tmp = node->rb_right;
node->rb_right = parent; node->rb_right = parent;
...@@ -189,10 +192,11 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) ...@@ -189,10 +192,11 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
RB_BLACK); RB_BLACK);
rb_set_parent_color(parent, node, RB_RED); rb_set_parent_color(parent, node, RB_RED);
parent = node; parent = node;
tmp = node->rb_left;
} }
/* Case 3 - left rotate at gparent */ /* Case 3 - left rotate at gparent */
gparent->rb_right = tmp = parent->rb_left; gparent->rb_right = tmp; /* == parent->rb_left */
parent->rb_left = gparent; parent->rb_left = gparent;
if (tmp) if (tmp)
rb_set_parent_color(tmp, gparent, RB_BLACK); 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, ...@@ -223,8 +227,9 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
break; break;
} else if (!parent) { } else if (!parent) {
break; 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)) { if (rb_is_red(sibling)) {
/* /*
* Case 1 - left rotate at parent * Case 1 - left rotate at parent
......
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