From: Michel Lespinasse <walken@google.com>
To: riel@redhat.com, peterz@infradead.org, daniel.santos@pobox.com,
aarcange@redhat.com, dwmw2@infradead.org,
akpm@linux-foundation.org
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org
Subject: [PATCH v2 2/9] rbtree: optimize fetching of sibling node
Date: Thu, 2 Aug 2012 15:34:11 -0700 [thread overview]
Message-ID: <1343946858-8170-3-git-send-email-walken@google.com> (raw)
In-Reply-To: <1343946858-8170-1-git-send-email-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>
---
lib/rbtree.c | 21 +++++++++++++--------
1 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/lib/rbtree.c b/lib/rbtree.c
index 0892670..61cdd0e 100644
--- a/lib/rbtree.c
+++ b/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
--
1.7.7.3
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-08-02 22:34 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-02 22:34 [PATCH v2 0/9] faster augmented rbtree interface Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 1/9] rbtree test: fix sparse warning about 64-bit constant Michel Lespinasse
2012-08-05 20:47 ` Rik van Riel
2012-08-02 22:34 ` Michel Lespinasse [this message]
2012-08-05 23:20 ` [PATCH v2 2/9] rbtree: optimize fetching of sibling node Rik van Riel
2012-08-06 14:23 ` Peter Zijlstra
2012-08-06 20:46 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 3/9] rbtree: add __rb_change_child() helper function Michel Lespinasse
2012-08-06 1:00 ` Rik van Riel
2012-08-06 14:22 ` Peter Zijlstra
2012-08-07 0:04 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 4/9] rbtree: place easiest case first in rb_erase() Michel Lespinasse
2012-08-06 1:13 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 5/9] rbtree: handle 1-child recoloring in rb_erase() instead of rb_erase_color() Michel Lespinasse
2012-08-06 1:27 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 6/9] rbtree: low level optimizations in rb_erase() Michel Lespinasse
2012-08-06 1:41 ` Rik van Riel
2012-08-06 14:21 ` Peter Zijlstra
2012-08-06 20:50 ` Michel Lespinasse
2012-08-06 20:58 ` Peter Zijlstra
2012-08-06 21:20 ` Michel Lespinasse
2012-08-06 21:21 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 7/9] rbtree: augmented rbtree test Michel Lespinasse
2012-08-06 2:11 ` Rik van Riel
2012-08-02 22:34 ` [PATCH v2 8/9] rbtree: faster augmented rbtree manipulation Michel Lespinasse
2012-08-06 2:12 ` Rik van Riel
2012-08-06 14:17 ` Peter Zijlstra
2012-08-06 15:38 ` Peter Zijlstra
2012-08-06 21:55 ` Michel Lespinasse
2012-08-07 7:12 ` [PATCH] rbtree: add RB_DECLARE_CALLBACKS() macro Michel Lespinasse
2012-08-06 14:25 ` [PATCH v2 8/9] rbtree: faster augmented rbtree manipulation Peter Zijlstra
2012-08-06 21:34 ` Michel Lespinasse
2012-08-06 21:36 ` Peter Zijlstra
2012-08-06 14:29 ` Peter Zijlstra
2012-08-06 21:38 ` Michel Lespinasse
2012-08-02 22:34 ` [PATCH v2 9/9] rbtree: remove prior augmented rbtree implementation Michel Lespinasse
2012-08-02 22:41 ` Joe Perches
2012-08-06 2:13 ` Rik van Riel
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=1343946858-8170-3-git-send-email-walken@google.com \
--to=walken@google.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=daniel.santos@pobox.com \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=peterz@infradead.org \
--cc=riel@redhat.com \
--cc=torvalds@linux-foundation.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).