All of lore.kernel.org
 help / color / mirror / Atom feed
From: zijun_hu <zijun_hu@zoho.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: peterz@infradead.org, dhowells@redhat.com,
	linux-kernel@vger.kernel.org, zijun_hu@htc.com
Subject: [PATCH 1/1] rbtree: correct mask for extracting node's parent
Date: Thu, 18 Aug 2016 16:19:10 +0800	[thread overview]
Message-ID: <57B56F7E.7090608@zoho.com> (raw)

From: zijun_hu <zijun_hu@htc.com>

for LP64 ABI, struct rb_node aligns at 8 bytes boundary due to
sizeof(long) == 8 normally, so 0x07 should be used to extract
node's parent rather than 0x03

the mask is corrected based on normal alignment of struct rb_node
macros are introduced to replace hard coding numbers too

Signed-off-by: zijun_hu <zijun_hu@htc.com>
---
 an alternative to macro RB_PARENT_MASK is shown below via __alignof__
 #define RB_PARENT_MASK  \
	(~((unsigned long)__alignof__(struct rb_node) - 1))

 include/linux/rbtree.h           | 4 +++-
 include/linux/rbtree_augmented.h | 5 +++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h
index e585018..f3a8596 100644
--- a/include/linux/rbtree.h
+++ b/include/linux/rbtree.h
@@ -44,8 +44,10 @@ struct rb_root {
 	struct rb_node *rb_node;
 };
 
+#define RB_PARENT_MASK	 (~((unsigned long)sizeof(long) - 1))
 
-#define rb_parent(r)   ((struct rb_node *)((r)->__rb_parent_color & ~3))
+#define rb_parent(r)   \
+	((struct rb_node *)((r)->__rb_parent_color & RB_PARENT_MASK))
 
 #define RB_ROOT	(struct rb_root) { NULL, }
 #define	rb_entry(ptr, type, member) container_of(ptr, type, member)
diff --git a/include/linux/rbtree_augmented.h b/include/linux/rbtree_augmented.h
index d076183..0a839ea 100644
--- a/include/linux/rbtree_augmented.h
+++ b/include/linux/rbtree_augmented.h
@@ -96,10 +96,11 @@ rbstatic const struct rb_augment_callbacks rbname = {			\
 
 #define	RB_RED		0
 #define	RB_BLACK	1
+#define RB_COLOR_MASK	 1UL
 
-#define __rb_parent(pc)    ((struct rb_node *)(pc & ~3))
+#define __rb_parent(pc)    ((struct rb_node *)(pc & RB_PARENT_MASK))
 
-#define __rb_color(pc)     ((pc) & 1)
+#define __rb_color(pc)     ((pc) & RB_COLOR_MASK)
 #define __rb_is_black(pc)  __rb_color(pc)
 #define __rb_is_red(pc)    (!__rb_color(pc))
 #define rb_color(rb)       __rb_color((rb)->__rb_parent_color)
-- 
1.9.1

             reply	other threads:[~2016-08-18  8:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-18  8:19 zijun_hu [this message]
2016-08-18  9:01 ` [PATCH 1/1] rbtree: correct mask for extracting node's parent Peter Zijlstra
2016-08-18 12:11   ` zijun_hu

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=57B56F7E.7090608@zoho.com \
    --to=zijun_hu@zoho.com \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=zijun_hu@htc.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.