rbtree: correct mask for extracting node's parent
PATCH 1/1 rbtree: correct mask for extracting node's parent
From: zijun_hu <[email protected]>
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
---
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(-)
include/linux/rbtree.h +3 -1
@@ -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)
include/linux/rbtree_augmented.h +3 -2
@@ -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)
Signature · 1 line
1.9.1
Quoted 5 lines · zijun_hu
From:
zijun_hu<[email protected]>for LP64 ABI, struct
rb_nodealigns at 8 bytes boundary due to sizeof(long) == 8 normally, so0x07should be used to extract node's parent rather than0x03
Doesn't matter though, in practise. The remaining bits are always 0.
Quoted 9 lines · Peter Zijlstra
Quoted 5 lines · zijun_hu
From:
zijun_hu<[email protected]>for LP64 ABI, struct
rb_nodealigns at 8 bytes boundary due to sizeof(long) == 8 normally, so0x07should be used to extract node's parent rather than0x03Doesn't matter though, in practise. The remaining bits are always 0.
okay, understand
it maybe more readable to replace hard coding numbers by macros