From: Praveen Kumar <kpraveen.lkml@gmail.com>
To: xen-devel@lists.xen.org
Cc: Andrea Arcangeli <aarcange@redhat.com>,
Jens Axboe <axboe@kernel.dk>,
sstabellini@kernel.org, wei.liu2@citrix.com,
David Woodhouse <David.Woodhouse@intel.com>,
George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com,
dario.faggioli@citrix.com, ian.jackson@eu.citrix.com,
tim@xen.org, Daniel Santos <daniel.santos@pobox.com>,
Praveen Kumar <kpraveen.lkml@gmail.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
jbeulich@suse.com, Andrew Morton <akpm@linux-foundation.org>,
Michel Lespinasse <walken@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 12/17] rbtree: optimize fetching of sibling node
Date: Thu, 1 Jun 2017 02:17:03 +0530 [thread overview]
Message-ID: <20170531204708.10470-13-kpraveen.lkml@gmail.com> (raw)
In-Reply-To: <20170531204708.10470-1-kpraveen.lkml@gmail.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.
commit 59633abf34e2f44b8e772a2c12a92132aa7c2220 from Linux tree
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>
---
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 253861d889..b65f00ca1f 100644
--- a/xen/common/rbtree.c
+++ b/xen/common/rbtree.c
@@ -108,9 +108,9 @@ 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;
+ if (parent != tmp) /* parent == gparent->rb_left */
{
- tmp = gparent->rb_right;
if (tmp && rb_is_red(tmp))
{
/*
@@ -134,7 +134,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
@@ -164,7 +165,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);
@@ -183,7 +184,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;
@@ -192,10 +194,11 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root)
rb_set_parent_color(tmp, parent, 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);
@@ -228,8 +231,10 @@ 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-05-31 20:47 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-31 20:46 [PATCH v2] xen: common: rbtree: ported updates from linux tree Praveen Kumar
2017-05-31 20:46 ` [PATCH 01/17] rb_tree: reorganize code in rb_erase() for additional changes Praveen Kumar
2017-05-31 20:46 ` [PATCH 02/17] rb_tree: make clear distinction between two different cases in rb_erase() Praveen Kumar
2017-05-31 20:46 ` [PATCH 03/17] rb_tree: remove redundant if()-condition " Praveen Kumar
2017-05-31 20:46 ` [PATCH 04/17] rbtree: empty nodes have no color Praveen Kumar
2017-05-31 20:46 ` [PATCH 05/17] rbtree: move some implementation details from rbtree.h to rbtree.c Praveen Kumar
2017-05-31 20:46 ` [PATCH 06/17] rbtree: break out of rb_insert_color loop after tree rotation Praveen Kumar
2017-05-31 20:46 ` [PATCH 07/17] rbtree: adjust root color in rb_insert_color() only when necessary Praveen Kumar
2017-05-31 20:46 ` [PATCH 08/17] rbtree: low level optimizations in rb_insert_color() Praveen Kumar
2017-05-31 20:47 ` [PATCH 09/17] rbtree: adjust node color in __rb_erase_color() only when necessary Praveen Kumar
2017-05-31 20:47 ` [PATCH 10/17] rbtree: optimize case selection logic in __rb_erase_color() Praveen Kumar
2017-05-31 20:47 ` [PATCH 11/17] rbtree: low level optimizations " Praveen Kumar
2017-05-31 20:47 ` Praveen Kumar [this message]
2017-05-31 20:47 ` [PATCH 13/17] rbtree: add __rb_change_child() helper function Praveen Kumar
2017-05-31 20:47 ` [PATCH 14/17] rbtree: place easiest case first in rb_erase() Praveen Kumar
2017-05-31 20:47 ` [PATCH 15/17] rbtree: handle 1-child recoloring in rb_erase() instead of rb_erase_color() Praveen Kumar
2017-05-31 21:09 ` 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=20170531204708.10470-13-kpraveen.lkml@gmail.com \
--to=kpraveen.lkml@gmail.com \
--cc=David.Woodhouse@intel.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=a.p.zijlstra@chello.nl \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andrew.cooper3@citrix.com \
--cc=axboe@kernel.dk \
--cc=daniel.santos@pobox.com \
--cc=dario.faggioli@citrix.com \
--cc=ebiederm@xmission.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=sstabellini@kernel.org \
--cc=tim@xen.org \
--cc=torvalds@linux-foundation.org \
--cc=walken@google.com \
--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).