From: Praveen Kumar <kpraveen.lkml@gmail.com>
To: xen-devel@lists.xen.org
Cc: sstabellini@kernel.org, wei.liu2@citrix.com,
George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com,
dario.faggioli@citrix.com, ian.jackson@eu.citrix.com,
tim@xen.org, kpraveen.lkml@gmail.com, jbeulich@suse.com
Subject: [PATCH v4 12/17] rbtree: optimize fetching of sibling node
Date: Tue, 4 Jul 2017 01:28:16 +0530 [thread overview]
Message-ID: <20170703195821.29845-13-kpraveen.lkml@gmail.com> (raw)
In-Reply-To: <20170703195821.29845-1-kpraveen.lkml@gmail.com>
From: Michel Lespinasse <walken@google.com>
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 <walken@google.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: David Woodhouse <David.Woodhouse@intel.com>
Acked-by: Rik 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
[Linux commit 59633abf34e2f44b8e772a2c12a92132aa7c2220]
Ported to Xen.
Signed-off-by: Praveen Kumar <kpraveen.lkml@gmail.com>
---
xen/common/rbtree.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/xen/common/rbtree.c b/xen/common/rbtree.c
index e24f4c4d39..56c815b4a5 100644
--- a/xen/common/rbtree.c
+++ b/xen/common/rbtree.c
@@ -106,8 +106,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
@@ -130,7 +130,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
*
@@ -150,6 +151,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;
}
/*
@@ -161,7 +163,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);
@@ -179,7 +181,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;
@@ -188,10 +191,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);
@@ -222,8 +226,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
--
2.12.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-07-03 19:58 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-03 19:58 [PATCH v4 00/17] xen: common: rbtree: ported updates from Linux tree Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 01/17] rbtree: changes to inline coding conventions with " Praveen Kumar
2017-07-04 8:24 ` Jan Beulich
2017-07-04 8:39 ` Dario Faggioli
2017-07-14 5:07 ` Praveen Kumar
2017-07-14 10:18 ` Jan Beulich
2017-07-03 19:58 ` [PATCH v4 02/17] rbtree: remove redundant if()-condition in rb_erase() Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 03/17] rbtree: empty nodes have no color Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 04/17] rbtree: move some implementation details from rbtree.h to rbtree.c Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 05/17] rbtree: break out of rb_insert_color loop after tree rotation Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 06/17] rbtree: adjust root color in rb_insert_color() only when necessary Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 07/17] rbtree: low level optimizations in rb_insert_color() Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 08/17] rbtree: adjust node color in __rb_erase_color() only when necessary Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 09/17] rbtree: optimize case selection logic in __rb_erase_color() Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 10/17] rbtree: low level optimizations " Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 11/17] rbtree: coding style adjustments Praveen Kumar
2017-07-03 19:58 ` Praveen Kumar [this message]
2017-07-03 19:58 ` [PATCH v4 13/17] rbtree: add __rb_change_child() helper function Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 14/17] rbtree: place easiest case first in rb_erase() Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 15/17] rbtree: handle 1-child recoloring in rb_erase() instead of rb_erase_color() Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 16/17] rbtree: low level optimizations in rb_erase() Praveen Kumar
2017-07-03 19:58 ` [PATCH v4 17/17] rbtree: fix typo in comment of rb_insert_color Praveen Kumar
2017-07-04 8:27 ` [PATCH v4 00/17] xen: common: rbtree: ported updates from Linux tree Jan Beulich
2017-07-04 8:45 ` Dario Faggioli
2017-07-14 4:58 ` Praveen Kumar
2017-07-04 8:49 ` Dario Faggioli
2017-07-04 9:14 ` Praveen Kumar
2017-07-14 4:53 ` Praveen Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170703195821.29845-13-kpraveen.lkml@gmail.com \
--to=kpraveen.lkml@gmail.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=dario.faggioli@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=sstabellini@kernel.org \
--cc=tim@xen.org \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).