xref: /openbmc/linux/lib/rbtree.c (revision 59633abf34e2f44b8e772a2c12a92132aa7c2220)
1 /*
2   Red Black Trees
3   (C) 1999  Andrea Arcangeli <andrea@suse.de>
4   (C) 2002  David Woodhouse <dwmw2@infradead.org>
5 
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2 of the License, or
9   (at your option) any later version.
10 
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15 
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 
20   linux/lib/rbtree.c
21 */
22 
23 #include <linux/rbtree.h>
24 #include <linux/export.h>
25 
26 /*
27  * red-black trees properties:  http://en.wikipedia.org/wiki/Rbtree
28  *
29  *  1) A node is either red or black
30  *  2) The root is black
31  *  3) All leaves (NULL) are black
32  *  4) Both children of every red node are black
33  *  5) Every simple path from root to leaves contains the same number
34  *     of black nodes.
35  *
36  *  4 and 5 give the O(log n) guarantee, since 4 implies you cannot have two
37  *  consecutive red nodes in a path and every red node is therefore followed by
38  *  a black. So if B is the number of black nodes on every simple path (as per
39  *  5), then the longest possible path due to 4 is 2B.
40  *
41  *  We shall indicate color with case, where black nodes are uppercase and red
42  *  nodes will be lowercase. Unknown color nodes shall be drawn as red within
43  *  parentheses and have some accompanying text comment.
44  */
45 
46 #define	RB_RED		0
47 #define	RB_BLACK	1
48 
49 #define rb_color(r)   ((r)->__rb_parent_color & 1)
50 #define rb_is_red(r)   (!rb_color(r))
51 #define rb_is_black(r) rb_color(r)
52 
53 static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p)
54 {
55 	rb->__rb_parent_color = rb_color(rb) | (unsigned long)p;
56 }
57 
58 static inline void rb_set_parent_color(struct rb_node *rb,
59 				       struct rb_node *p, int color)
60 {
61 	rb->__rb_parent_color = (unsigned long)p | color;
62 }
63 
64 static inline struct rb_node *rb_red_parent(struct rb_node *red)
65 {
66 	return (struct rb_node *)red->__rb_parent_color;
67 }
68 
69 /*
70  * Helper function for rotations:
71  * - old's parent and color get assigned to new
72  * - old gets assigned new as a parent and 'color' as a color.
73  */
74 static inline void
75 __rb_rotate_set_parents(struct rb_node *old, struct rb_node *new,
76 			struct rb_root *root, int color)
77 {
78 	struct rb_node *parent = rb_parent(old);
79 	new->__rb_parent_color = old->__rb_parent_color;
80 	rb_set_parent_color(old, new, color);
81 	if (parent) {
82 		if (parent->rb_left == old)
83 			parent->rb_left = new;
84 		else
85 			parent->rb_right = new;
86 	} else
87 		root->rb_node = new;
88 }
89 
90 void rb_insert_color(struct rb_node *node, struct rb_root *root)
91 {
92 	struct rb_node *parent = rb_red_parent(node), *gparent, *tmp;
93 
94 	while (true) {
95 		/*
96 		 * Loop invariant: node is red
97 		 *
98 		 * If there is a black parent, we are done.
99 		 * Otherwise, take some corrective action as we don't
100 		 * want a red root or two consecutive red nodes.
101 		 */
102 		if (!parent) {
103 			rb_set_parent_color(node, NULL, RB_BLACK);
104 			break;
105 		} else if (rb_is_black(parent))
106 			break;
107 
108 		gparent = rb_red_parent(parent);
109 
110 		tmp = gparent->rb_right;
111 		if (parent != tmp) {	/* parent == gparent->rb_left */
112 			if (tmp && rb_is_red(tmp)) {
113 				/*
114 				 * Case 1 - color flips
115 				 *
116 				 *       G            g
117 				 *      / \          / \
118 				 *     p   u  -->   P   U
119 				 *    /            /
120 				 *   n            N
121 				 *
122 				 * However, since g's parent might be red, and
123 				 * 4) does not allow this, we need to recurse
124 				 * at g.
125 				 */
126 				rb_set_parent_color(tmp, gparent, RB_BLACK);
127 				rb_set_parent_color(parent, gparent, RB_BLACK);
128 				node = gparent;
129 				parent = rb_parent(node);
130 				rb_set_parent_color(node, parent, RB_RED);
131 				continue;
132 			}
133 
134 			tmp = parent->rb_right;
135 			if (node == tmp) {
136 				/*
137 				 * Case 2 - left rotate at parent
138 				 *
139 				 *      G             G
140 				 *     / \           / \
141 				 *    p   U  -->    n   U
142 				 *     \           /
143 				 *      n         p
144 				 *
145 				 * This still leaves us in violation of 4), the
146 				 * continuation into Case 3 will fix that.
147 				 */
148 				parent->rb_right = tmp = node->rb_left;
149 				node->rb_left = parent;
150 				if (tmp)
151 					rb_set_parent_color(tmp, parent,
152 							    RB_BLACK);
153 				rb_set_parent_color(parent, node, RB_RED);
154 				parent = node;
155 				tmp = node->rb_right;
156 			}
157 
158 			/*
159 			 * Case 3 - right rotate at gparent
160 			 *
161 			 *        G           P
162 			 *       / \         / \
163 			 *      p   U  -->  n   g
164 			 *     /                 \
165 			 *    n                   U
166 			 */
167 			gparent->rb_left = tmp;  /* == parent->rb_right */
168 			parent->rb_right = gparent;
169 			if (tmp)
170 				rb_set_parent_color(tmp, gparent, RB_BLACK);
171 			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
172 			break;
173 		} else {
174 			tmp = gparent->rb_left;
175 			if (tmp && rb_is_red(tmp)) {
176 				/* Case 1 - color flips */
177 				rb_set_parent_color(tmp, gparent, RB_BLACK);
178 				rb_set_parent_color(parent, gparent, RB_BLACK);
179 				node = gparent;
180 				parent = rb_parent(node);
181 				rb_set_parent_color(node, parent, RB_RED);
182 				continue;
183 			}
184 
185 			tmp = parent->rb_left;
186 			if (node == tmp) {
187 				/* Case 2 - right rotate at parent */
188 				parent->rb_left = tmp = node->rb_right;
189 				node->rb_right = parent;
190 				if (tmp)
191 					rb_set_parent_color(tmp, parent,
192 							    RB_BLACK);
193 				rb_set_parent_color(parent, node, RB_RED);
194 				parent = node;
195 				tmp = node->rb_left;
196 			}
197 
198 			/* Case 3 - left rotate at gparent */
199 			gparent->rb_right = tmp;  /* == parent->rb_left */
200 			parent->rb_left = gparent;
201 			if (tmp)
202 				rb_set_parent_color(tmp, gparent, RB_BLACK);
203 			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
204 			break;
205 		}
206 	}
207 }
208 EXPORT_SYMBOL(rb_insert_color);
209 
210 static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
211 			     struct rb_root *root)
212 {
213 	struct rb_node *sibling, *tmp1, *tmp2;
214 
215 	while (true) {
216 		/*
217 		 * Loop invariant: all leaf paths going through node have a
218 		 * black node count that is 1 lower than other leaf paths.
219 		 *
220 		 * If node is red, we can flip it to black to adjust.
221 		 * If node is the root, all leaf paths go through it.
222 		 * Otherwise, we need to adjust the tree through color flips
223 		 * and tree rotations as per one of the 4 cases below.
224 		 */
225 		if (node && rb_is_red(node)) {
226 			rb_set_parent_color(node, parent, RB_BLACK);
227 			break;
228 		} else if (!parent) {
229 			break;
230 		}
231 		sibling = parent->rb_right;
232 		if (node != sibling) {	/* node == parent->rb_left */
233 			if (rb_is_red(sibling)) {
234 				/*
235 				 * Case 1 - left rotate at parent
236 				 *
237 				 *     P               S
238 				 *    / \             / \
239 				 *   N   s    -->    p   Sr
240 				 *      / \         / \
241 				 *     Sl  Sr      N   Sl
242 				 */
243 				parent->rb_right = tmp1 = sibling->rb_left;
244 				sibling->rb_left = parent;
245 				rb_set_parent_color(tmp1, parent, RB_BLACK);
246 				__rb_rotate_set_parents(parent, sibling, root,
247 							RB_RED);
248 				sibling = tmp1;
249 			}
250 			tmp1 = sibling->rb_right;
251 			if (!tmp1 || rb_is_black(tmp1)) {
252 				tmp2 = sibling->rb_left;
253 				if (!tmp2 || rb_is_black(tmp2)) {
254 					/*
255 					 * Case 2 - sibling color flip
256 					 * (p could be either color here)
257 					 *
258 					 *    (p)           (p)
259 					 *    / \           / \
260 					 *   N   S    -->  N   s
261 					 *      / \           / \
262 					 *     Sl  Sr        Sl  Sr
263 					 *
264 					 * This leaves us violating 5), so
265 					 * recurse at p. If p is red, the
266 					 * recursion will just flip it to black
267 					 * and exit. If coming from Case 1,
268 					 * p is known to be red.
269 					 */
270 					rb_set_parent_color(sibling, parent,
271 							    RB_RED);
272 					node = parent;
273 					parent = rb_parent(node);
274 					continue;
275 				}
276 				/*
277 				 * Case 3 - right rotate at sibling
278 				 * (p could be either color here)
279 				 *
280 				 *   (p)           (p)
281 				 *   / \           / \
282 				 *  N   S    -->  N   Sl
283 				 *     / \             \
284 				 *    sl  Sr            s
285 				 *                       \
286 				 *                        Sr
287 				 */
288 				sibling->rb_left = tmp1 = tmp2->rb_right;
289 				tmp2->rb_right = sibling;
290 				parent->rb_right = tmp2;
291 				if (tmp1)
292 					rb_set_parent_color(tmp1, sibling,
293 							    RB_BLACK);
294 				tmp1 = sibling;
295 				sibling = tmp2;
296 			}
297 			/*
298 			 * Case 4 - left rotate at parent + color flips
299 			 * (p and sl could be either color here.
300 			 *  After rotation, p becomes black, s acquires
301 			 *  p's color, and sl keeps its color)
302 			 *
303 			 *      (p)             (s)
304 			 *      / \             / \
305 			 *     N   S     -->   P   Sr
306 			 *        / \         / \
307 			 *      (sl) sr      N  (sl)
308 			 */
309 			parent->rb_right = tmp2 = sibling->rb_left;
310 			sibling->rb_left = parent;
311 			rb_set_parent_color(tmp1, sibling, RB_BLACK);
312 			if (tmp2)
313 				rb_set_parent(tmp2, parent);
314 			__rb_rotate_set_parents(parent, sibling, root,
315 						RB_BLACK);
316 			break;
317 		} else {
318 			sibling = parent->rb_left;
319 			if (rb_is_red(sibling)) {
320 				/* Case 1 - right rotate at parent */
321 				parent->rb_left = tmp1 = sibling->rb_right;
322 				sibling->rb_right = parent;
323 				rb_set_parent_color(tmp1, parent, RB_BLACK);
324 				__rb_rotate_set_parents(parent, sibling, root,
325 							RB_RED);
326 				sibling = tmp1;
327 			}
328 			tmp1 = sibling->rb_left;
329 			if (!tmp1 || rb_is_black(tmp1)) {
330 				tmp2 = sibling->rb_right;
331 				if (!tmp2 || rb_is_black(tmp2)) {
332 					/* Case 2 - sibling color flip */
333 					rb_set_parent_color(sibling, parent,
334 							    RB_RED);
335 					node = parent;
336 					parent = rb_parent(node);
337 					continue;
338 				}
339 				/* Case 3 - right rotate at sibling */
340 				sibling->rb_right = tmp1 = tmp2->rb_left;
341 				tmp2->rb_left = sibling;
342 				parent->rb_left = tmp2;
343 				if (tmp1)
344 					rb_set_parent_color(tmp1, sibling,
345 							    RB_BLACK);
346 				tmp1 = sibling;
347 				sibling = tmp2;
348 			}
349 			/* Case 4 - left rotate at parent + color flips */
350 			parent->rb_left = tmp2 = sibling->rb_right;
351 			sibling->rb_right = parent;
352 			rb_set_parent_color(tmp1, sibling, RB_BLACK);
353 			if (tmp2)
354 				rb_set_parent(tmp2, parent);
355 			__rb_rotate_set_parents(parent, sibling, root,
356 						RB_BLACK);
357 			break;
358 		}
359 	}
360 }
361 
362 void rb_erase(struct rb_node *node, struct rb_root *root)
363 {
364 	struct rb_node *child, *parent;
365 	int color;
366 
367 	if (!node->rb_left)
368 		child = node->rb_right;
369 	else if (!node->rb_right)
370 		child = node->rb_left;
371 	else {
372 		struct rb_node *old = node, *left;
373 
374 		node = node->rb_right;
375 		while ((left = node->rb_left) != NULL)
376 			node = left;
377 
378 		if (rb_parent(old)) {
379 			if (rb_parent(old)->rb_left == old)
380 				rb_parent(old)->rb_left = node;
381 			else
382 				rb_parent(old)->rb_right = node;
383 		} else
384 			root->rb_node = node;
385 
386 		child = node->rb_right;
387 		parent = rb_parent(node);
388 		color = rb_color(node);
389 
390 		if (parent == old) {
391 			parent = node;
392 		} else {
393 			if (child)
394 				rb_set_parent(child, parent);
395 			parent->rb_left = child;
396 
397 			node->rb_right = old->rb_right;
398 			rb_set_parent(old->rb_right, node);
399 		}
400 
401 		node->__rb_parent_color = old->__rb_parent_color;
402 		node->rb_left = old->rb_left;
403 		rb_set_parent(old->rb_left, node);
404 
405 		goto color;
406 	}
407 
408 	parent = rb_parent(node);
409 	color = rb_color(node);
410 
411 	if (child)
412 		rb_set_parent(child, parent);
413 	if (parent) {
414 		if (parent->rb_left == node)
415 			parent->rb_left = child;
416 		else
417 			parent->rb_right = child;
418 	} else
419 		root->rb_node = child;
420 
421 color:
422 	if (color == RB_BLACK)
423 		__rb_erase_color(child, parent, root);
424 }
425 EXPORT_SYMBOL(rb_erase);
426 
427 static void rb_augment_path(struct rb_node *node, rb_augment_f func, void *data)
428 {
429 	struct rb_node *parent;
430 
431 up:
432 	func(node, data);
433 	parent = rb_parent(node);
434 	if (!parent)
435 		return;
436 
437 	if (node == parent->rb_left && parent->rb_right)
438 		func(parent->rb_right, data);
439 	else if (parent->rb_left)
440 		func(parent->rb_left, data);
441 
442 	node = parent;
443 	goto up;
444 }
445 
446 /*
447  * after inserting @node into the tree, update the tree to account for
448  * both the new entry and any damage done by rebalance
449  */
450 void rb_augment_insert(struct rb_node *node, rb_augment_f func, void *data)
451 {
452 	if (node->rb_left)
453 		node = node->rb_left;
454 	else if (node->rb_right)
455 		node = node->rb_right;
456 
457 	rb_augment_path(node, func, data);
458 }
459 EXPORT_SYMBOL(rb_augment_insert);
460 
461 /*
462  * before removing the node, find the deepest node on the rebalance path
463  * that will still be there after @node gets removed
464  */
465 struct rb_node *rb_augment_erase_begin(struct rb_node *node)
466 {
467 	struct rb_node *deepest;
468 
469 	if (!node->rb_right && !node->rb_left)
470 		deepest = rb_parent(node);
471 	else if (!node->rb_right)
472 		deepest = node->rb_left;
473 	else if (!node->rb_left)
474 		deepest = node->rb_right;
475 	else {
476 		deepest = rb_next(node);
477 		if (deepest->rb_right)
478 			deepest = deepest->rb_right;
479 		else if (rb_parent(deepest) != node)
480 			deepest = rb_parent(deepest);
481 	}
482 
483 	return deepest;
484 }
485 EXPORT_SYMBOL(rb_augment_erase_begin);
486 
487 /*
488  * after removal, update the tree to account for the removed entry
489  * and any rebalance damage.
490  */
491 void rb_augment_erase_end(struct rb_node *node, rb_augment_f func, void *data)
492 {
493 	if (node)
494 		rb_augment_path(node, func, data);
495 }
496 EXPORT_SYMBOL(rb_augment_erase_end);
497 
498 /*
499  * This function returns the first node (in sort order) of the tree.
500  */
501 struct rb_node *rb_first(const struct rb_root *root)
502 {
503 	struct rb_node	*n;
504 
505 	n = root->rb_node;
506 	if (!n)
507 		return NULL;
508 	while (n->rb_left)
509 		n = n->rb_left;
510 	return n;
511 }
512 EXPORT_SYMBOL(rb_first);
513 
514 struct rb_node *rb_last(const struct rb_root *root)
515 {
516 	struct rb_node	*n;
517 
518 	n = root->rb_node;
519 	if (!n)
520 		return NULL;
521 	while (n->rb_right)
522 		n = n->rb_right;
523 	return n;
524 }
525 EXPORT_SYMBOL(rb_last);
526 
527 struct rb_node *rb_next(const struct rb_node *node)
528 {
529 	struct rb_node *parent;
530 
531 	if (RB_EMPTY_NODE(node))
532 		return NULL;
533 
534 	/*
535 	 * If we have a right-hand child, go down and then left as far
536 	 * as we can.
537 	 */
538 	if (node->rb_right) {
539 		node = node->rb_right;
540 		while (node->rb_left)
541 			node=node->rb_left;
542 		return (struct rb_node *)node;
543 	}
544 
545 	/*
546 	 * No right-hand children. Everything down and left is smaller than us,
547 	 * so any 'next' node must be in the general direction of our parent.
548 	 * Go up the tree; any time the ancestor is a right-hand child of its
549 	 * parent, keep going up. First time it's a left-hand child of its
550 	 * parent, said parent is our 'next' node.
551 	 */
552 	while ((parent = rb_parent(node)) && node == parent->rb_right)
553 		node = parent;
554 
555 	return parent;
556 }
557 EXPORT_SYMBOL(rb_next);
558 
559 struct rb_node *rb_prev(const struct rb_node *node)
560 {
561 	struct rb_node *parent;
562 
563 	if (RB_EMPTY_NODE(node))
564 		return NULL;
565 
566 	/*
567 	 * If we have a left-hand child, go down and then right as far
568 	 * as we can.
569 	 */
570 	if (node->rb_left) {
571 		node = node->rb_left;
572 		while (node->rb_right)
573 			node=node->rb_right;
574 		return (struct rb_node *)node;
575 	}
576 
577 	/*
578 	 * No left-hand children. Go up till we find an ancestor which
579 	 * is a right-hand child of its parent.
580 	 */
581 	while ((parent = rb_parent(node)) && node == parent->rb_left)
582 		node = parent;
583 
584 	return parent;
585 }
586 EXPORT_SYMBOL(rb_prev);
587 
588 void rb_replace_node(struct rb_node *victim, struct rb_node *new,
589 		     struct rb_root *root)
590 {
591 	struct rb_node *parent = rb_parent(victim);
592 
593 	/* Set the surrounding nodes to point to the replacement */
594 	if (parent) {
595 		if (victim == parent->rb_left)
596 			parent->rb_left = new;
597 		else
598 			parent->rb_right = new;
599 	} else {
600 		root->rb_node = new;
601 	}
602 	if (victim->rb_left)
603 		rb_set_parent(victim->rb_left, new);
604 	if (victim->rb_right)
605 		rb_set_parent(victim->rb_right, new);
606 
607 	/* Copy the pointers/colour from the victim to the replacement */
608 	*new = *victim;
609 }
610 EXPORT_SYMBOL(rb_replace_node);
611