diff options
author | David Woodhouse <dwmw2@infradead.org> | 2006-04-21 08:35:51 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-04-21 08:35:51 -0400 |
commit | 55a981027fc393c86de2c4e7836c9515088a9a58 (patch) | |
tree | dd950b79d9f57ce48b2b2a91262b88eecb5296da /include/linux/rbtree.h | |
parent | 1975e59375756da4ff4e6e7d12f67485e813ace0 (diff) |
[RBTREE] Merge colour and parent fields of struct rb_node.
We only used a single bit for colour information, so having a whole
machine word of space allocated for it was a bit wasteful. Instead,
store it in the lowest bit of the 'parent' pointer, since that was
always going to be aligned anyway.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'include/linux/rbtree.h')
-rw-r--r-- | include/linux/rbtree.h | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h index ffee81ce7b6f..748be50329d8 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h | |||
@@ -99,28 +99,35 @@ static inline struct page * rb_insert_page_cache(struct inode * inode, | |||
99 | 99 | ||
100 | struct rb_node | 100 | struct rb_node |
101 | { | 101 | { |
102 | struct rb_node *rb_parent; | 102 | unsigned long rb_parent_colour; |
103 | int rb_color; | ||
104 | #define RB_RED 0 | 103 | #define RB_RED 0 |
105 | #define RB_BLACK 1 | 104 | #define RB_BLACK 1 |
106 | struct rb_node *rb_right; | 105 | struct rb_node *rb_right; |
107 | struct rb_node *rb_left; | 106 | struct rb_node *rb_left; |
108 | }; | 107 | }; |
109 | 108 | ||
110 | #define rb_parent(r) ((r)->rb_parent) | ||
111 | #define rb_set_parent(r,p) do { (r)->rb_parent = p; } while (0) | ||
112 | #define rb_colour(r) ((r)->rb_colour) | ||
113 | #define rb_is_red(r) ((r)->colour == RB_RED) | ||
114 | #define rb_is_black(r) ((r)->colour == RB_BLACK) | ||
115 | #define rb_set_red(r) do { (r)->colour = RB_RED; } while (0) | ||
116 | #define rb_set_black(r) do { (r)->colour = RB_BLACK; } while (0) | ||
117 | #define rb_set_colour(r,c) do { (r)->colour = (c); } while (0) | ||
118 | |||
119 | struct rb_root | 109 | struct rb_root |
120 | { | 110 | { |
121 | struct rb_node *rb_node; | 111 | struct rb_node *rb_node; |
122 | }; | 112 | }; |
123 | 113 | ||
114 | |||
115 | #define rb_parent(r) ((struct rb_node *)((r)->rb_parent_colour & ~3)) | ||
116 | #define rb_colour(r) ((r)->rb_parent_colour & 1) | ||
117 | #define rb_is_red(r) (!rb_colour(r)) | ||
118 | #define rb_is_black(r) rb_colour(r) | ||
119 | #define rb_set_red(r) do { (r)->rb_parent_colour &= ~1; } while (0) | ||
120 | #define rb_set_black(r) do { (r)->rb_parent_colour |= 1; } while (0) | ||
121 | |||
122 | static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p) | ||
123 | { | ||
124 | rb->rb_parent_colour = (rb->rb_parent_colour & 3) | (unsigned long)p; | ||
125 | } | ||
126 | static inline void rb_set_colour(struct rb_node *rb, int colour) | ||
127 | { | ||
128 | rb->rb_parent_colour = (rb->rb_parent_colour & ~1) | colour; | ||
129 | } | ||
130 | |||
124 | #define RB_ROOT (struct rb_root) { NULL, } | 131 | #define RB_ROOT (struct rb_root) { NULL, } |
125 | #define rb_entry(ptr, type, member) container_of(ptr, type, member) | 132 | #define rb_entry(ptr, type, member) container_of(ptr, type, member) |
126 | 133 | ||
@@ -140,8 +147,7 @@ extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, | |||
140 | static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, | 147 | static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, |
141 | struct rb_node ** rb_link) | 148 | struct rb_node ** rb_link) |
142 | { | 149 | { |
143 | node->rb_parent = parent; | 150 | node->rb_parent_colour = (unsigned long )parent; |
144 | node->rb_color = RB_RED; | ||
145 | node->rb_left = node->rb_right = NULL; | 151 | node->rb_left = node->rb_right = NULL; |
146 | 152 | ||
147 | *rb_link = node; | 153 | *rb_link = node; |