Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+13 −8
Original line number Original line Diff line number Diff line
@@ -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)
				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)
							    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)
			 *     /                 \
			 *     /                 \
			 *    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)
				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)
							    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,
			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