xref: /openbmc/linux/lib/rbtree.c (revision 7ce6ff9e5de99e7b72019c7de82fb438fe1dc5a0)
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 		if (parent == gparent->rb_left) {
111 			tmp = gparent->rb_right;
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 			if (parent->rb_right == node) {
135 				/*
136 				 * Case 2 - left rotate at parent
137 				 *
138 				 *      G             G
139 				 *     / \           / \
140 				 *    p   U  -->    n   U
141 				 *     \           /
142 				 *      n         p
143 				 *
144 				 * This still leaves us in violation of 4), the
145 				 * continuation into Case 3 will fix that.
146 				 */
147 				parent->rb_right = tmp = node->rb_left;
148 				node->rb_left = parent;
149 				if (tmp)
150 					rb_set_parent_color(tmp, parent,
151 							    RB_BLACK);
152 				rb_set_parent_color(parent, node, RB_RED);
153 				parent = node;
154 			}
155 
156 			/*
157 			 * Case 3 - right rotate at gparent
158 			 *
159 			 *        G           P
160 			 *       / \         / \
161 			 *      p   U  -->  n   g
162 			 *     /                 \
163 			 *    n                   U
164 			 */
165 			gparent->rb_left = tmp = parent->rb_right;
166 			parent->rb_right = gparent;
167 			if (tmp)
168 				rb_set_parent_color(tmp, gparent, RB_BLACK);
169 			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
170 			break;
171 		} else {
172 			tmp = gparent->rb_left;
173 			if (tmp && rb_is_red(tmp)) {
174 				/* Case 1 - color flips */
175 				rb_set_parent_color(tmp, gparent, RB_BLACK);
176 				rb_set_parent_color(parent, gparent, RB_BLACK);
177 				node = gparent;
178 				parent = rb_parent(node);
179 				rb_set_parent_color(node, parent, RB_RED);
180 				continue;
181 			}
182 
183 			if (parent->rb_left == node) {
184 				/* Case 2 - right rotate at parent */
185 				parent->rb_left = tmp = node->rb_right;
186 				node->rb_right = parent;
187 				if (tmp)
188 					rb_set_parent_color(tmp, parent,
189 							    RB_BLACK);
190 				rb_set_parent_color(parent, node, RB_RED);
191 				parent = node;
192 			}
193 
194 			/* Case 3 - left rotate at gparent */
195 			gparent->rb_right = tmp = parent->rb_left;
196 			parent->rb_left = gparent;
197 			if (tmp)
198 				rb_set_parent_color(tmp, gparent, RB_BLACK);
199 			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
200 			break;
201 		}
202 	}
203 }
204 EXPORT_SYMBOL(rb_insert_color);
205 
206 static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
207 			     struct rb_root *root)
208 {
209 	struct rb_node *sibling, *tmp1, *tmp2;
210 
211 	while (true) {
212 		/*
213 		 * Loop invariant: all leaf paths going through node have a
214 		 * black node count that is 1 lower than other leaf paths.
215 		 *
216 		 * If node is red, we can flip it to black to adjust.
217 		 * If node is the root, all leaf paths go through it.
218 		 * Otherwise, we need to adjust the tree through color flips
219 		 * and tree rotations as per one of the 4 cases below.
220 		 */
221 		if (node && rb_is_red(node)) {
222 			rb_set_parent_color(node, parent, RB_BLACK);
223 			break;
224 		} else if (!parent) {
225 			break;
226 		} else if (parent->rb_left == node) {
227 			sibling = parent->rb_right;
228 			if (rb_is_red(sibling)) {
229 				/*
230 				 * Case 1 - left rotate at parent
231 				 *
232 				 *     P               S
233 				 *    / \             / \
234 				 *   N   s    -->    p   Sr
235 				 *      / \         / \
236 				 *     Sl  Sr      N   Sl
237 				 */
238 				parent->rb_right = tmp1 = sibling->rb_left;
239 				sibling->rb_left = parent;
240 				rb_set_parent_color(tmp1, parent, RB_BLACK);
241 				__rb_rotate_set_parents(parent, sibling, root,
242 							RB_RED);
243 				sibling = tmp1;
244 			}
245 			tmp1 = sibling->rb_right;
246 			if (!tmp1 || rb_is_black(tmp1)) {
247 				tmp2 = sibling->rb_left;
248 				if (!tmp2 || rb_is_black(tmp2)) {
249 					/*
250 					 * Case 2 - sibling color flip
251 					 * (p could be either color here)
252 					 *
253 					 *    (p)           (p)
254 					 *    / \           / \
255 					 *   N   S    -->  N   s
256 					 *      / \           / \
257 					 *     Sl  Sr        Sl  Sr
258 					 *
259 					 * This leaves us violating 5), so
260 					 * recurse at p. If p is red, the
261 					 * recursion will just flip it to black
262 					 * and exit. If coming from Case 1,
263 					 * p is known to be red.
264 					 */
265 					rb_set_parent_color(sibling, parent,
266 							    RB_RED);
267 					node = parent;
268 					parent = rb_parent(node);
269 					continue;
270 				}
271 				/*
272 				 * Case 3 - right rotate at sibling
273 				 * (p could be either color here)
274 				 *
275 				 *   (p)           (p)
276 				 *   / \           / \
277 				 *  N   S    -->  N   Sl
278 				 *     / \             \
279 				 *    sl  Sr            s
280 				 *                       \
281 				 *                        Sr
282 				 */
283 				sibling->rb_left = tmp1 = tmp2->rb_right;
284 				tmp2->rb_right = sibling;
285 				parent->rb_right = tmp2;
286 				if (tmp1)
287 					rb_set_parent_color(tmp1, sibling,
288 							    RB_BLACK);
289 				tmp1 = sibling;
290 				sibling = tmp2;
291 			}
292 			/*
293 			 * Case 4 - left rotate at parent + color flips
294 			 * (p and sl could be either color here.
295 			 *  After rotation, p becomes black, s acquires
296 			 *  p's color, and sl keeps its color)
297 			 *
298 			 *      (p)             (s)
299 			 *      / \             / \
300 			 *     N   S     -->   P   Sr
301 			 *        / \         / \
302 			 *      (sl) sr      N  (sl)
303 			 */
304 			parent->rb_right = tmp2 = sibling->rb_left;
305 			sibling->rb_left = parent;
306 			rb_set_parent_color(tmp1, sibling, RB_BLACK);
307 			if (tmp2)
308 				rb_set_parent(tmp2, parent);
309 			__rb_rotate_set_parents(parent, sibling, root,
310 						RB_BLACK);
311 			break;
312 		} else {
313 			sibling = parent->rb_left;
314 			if (rb_is_red(sibling)) {
315 				/* Case 1 - right rotate at parent */
316 				parent->rb_left = tmp1 = sibling->rb_right;
317 				sibling->rb_right = parent;
318 				rb_set_parent_color(tmp1, parent, RB_BLACK);
319 				__rb_rotate_set_parents(parent, sibling, root,
320 							RB_RED);
321 				sibling = tmp1;
322 			}
323 			tmp1 = sibling->rb_left;
324 			if (!tmp1 || rb_is_black(tmp1)) {
325 				tmp2 = sibling->rb_right;
326 				if (!tmp2 || rb_is_black(tmp2)) {
327 					/* Case 2 - sibling color flip */
328 					rb_set_parent_color(sibling, parent,
329 							    RB_RED);
330 					node = parent;
331 					parent = rb_parent(node);
332 					continue;
333 				}
334 				/* Case 3 - right rotate at sibling */
335 				sibling->rb_right = tmp1 = tmp2->rb_left;
336 				tmp2->rb_left = sibling;
337 				parent->rb_left = tmp2;
338 				if (tmp1)
339 					rb_set_parent_color(tmp1, sibling,
340 							    RB_BLACK);
341 				tmp1 = sibling;
342 				sibling = tmp2;
343 			}
344 			/* Case 4 - left rotate at parent + color flips */
345 			parent->rb_left = tmp2 = sibling->rb_right;
346 			sibling->rb_right = parent;
347 			rb_set_parent_color(tmp1, sibling, RB_BLACK);
348 			if (tmp2)
349 				rb_set_parent(tmp2, parent);
350 			__rb_rotate_set_parents(parent, sibling, root,
351 						RB_BLACK);
352 			break;
353 		}
354 	}
355 }
356 
357 void rb_erase(struct rb_node *node, struct rb_root *root)
358 {
359 	struct rb_node *child, *parent;
360 	int color;
361 
362 	if (!node->rb_left)
363 		child = node->rb_right;
364 	else if (!node->rb_right)
365 		child = node->rb_left;
366 	else {
367 		struct rb_node *old = node, *left;
368 
369 		node = node->rb_right;
370 		while ((left = node->rb_left) != NULL)
371 			node = left;
372 
373 		if (rb_parent(old)) {
374 			if (rb_parent(old)->rb_left == old)
375 				rb_parent(old)->rb_left = node;
376 			else
377 				rb_parent(old)->rb_right = node;
378 		} else
379 			root->rb_node = node;
380 
381 		child = node->rb_right;
382 		parent = rb_parent(node);
383 		color = rb_color(node);
384 
385 		if (parent == old) {
386 			parent = node;
387 		} else {
388 			if (child)
389 				rb_set_parent(child, parent);
390 			parent->rb_left = child;
391 
392 			node->rb_right = old->rb_right;
393 			rb_set_parent(old->rb_right, node);
394 		}
395 
396 		node->__rb_parent_color = old->__rb_parent_color;
397 		node->rb_left = old->rb_left;
398 		rb_set_parent(old->rb_left, node);
399 
400 		goto color;
401 	}
402 
403 	parent = rb_parent(node);
404 	color = rb_color(node);
405 
406 	if (child)
407 		rb_set_parent(child, parent);
408 	if (parent) {
409 		if (parent->rb_left == node)
410 			parent->rb_left = child;
411 		else
412 			parent->rb_right = child;
413 	} else
414 		root->rb_node = child;
415 
416 color:
417 	if (color == RB_BLACK)
418 		__rb_erase_color(child, parent, root);
419 }
420 EXPORT_SYMBOL(rb_erase);
421 
422 static void rb_augment_path(struct rb_node *node, rb_augment_f func, void *data)
423 {
424 	struct rb_node *parent;
425 
426 up:
427 	func(node, data);
428 	parent = rb_parent(node);
429 	if (!parent)
430 		return;
431 
432 	if (node == parent->rb_left && parent->rb_right)
433 		func(parent->rb_right, data);
434 	else if (parent->rb_left)
435 		func(parent->rb_left, data);
436 
437 	node = parent;
438 	goto up;
439 }
440 
441 /*
442  * after inserting @node into the tree, update the tree to account for
443  * both the new entry and any damage done by rebalance
444  */
445 void rb_augment_insert(struct rb_node *node, rb_augment_f func, void *data)
446 {
447 	if (node->rb_left)
448 		node = node->rb_left;
449 	else if (node->rb_right)
450 		node = node->rb_right;
451 
452 	rb_augment_path(node, func, data);
453 }
454 EXPORT_SYMBOL(rb_augment_insert);
455 
456 /*
457  * before removing the node, find the deepest node on the rebalance path
458  * that will still be there after @node gets removed
459  */
460 struct rb_node *rb_augment_erase_begin(struct rb_node *node)
461 {
462 	struct rb_node *deepest;
463 
464 	if (!node->rb_right && !node->rb_left)
465 		deepest = rb_parent(node);
466 	else if (!node->rb_right)
467 		deepest = node->rb_left;
468 	else if (!node->rb_left)
469 		deepest = node->rb_right;
470 	else {
471 		deepest = rb_next(node);
472 		if (deepest->rb_right)
473 			deepest = deepest->rb_right;
474 		else if (rb_parent(deepest) != node)
475 			deepest = rb_parent(deepest);
476 	}
477 
478 	return deepest;
479 }
480 EXPORT_SYMBOL(rb_augment_erase_begin);
481 
482 /*
483  * after removal, update the tree to account for the removed entry
484  * and any rebalance damage.
485  */
486 void rb_augment_erase_end(struct rb_node *node, rb_augment_f func, void *data)
487 {
488 	if (node)
489 		rb_augment_path(node, func, data);
490 }
491 EXPORT_SYMBOL(rb_augment_erase_end);
492 
493 /*
494  * This function returns the first node (in sort order) of the tree.
495  */
496 struct rb_node *rb_first(const struct rb_root *root)
497 {
498 	struct rb_node	*n;
499 
500 	n = root->rb_node;
501 	if (!n)
502 		return NULL;
503 	while (n->rb_left)
504 		n = n->rb_left;
505 	return n;
506 }
507 EXPORT_SYMBOL(rb_first);
508 
509 struct rb_node *rb_last(const struct rb_root *root)
510 {
511 	struct rb_node	*n;
512 
513 	n = root->rb_node;
514 	if (!n)
515 		return NULL;
516 	while (n->rb_right)
517 		n = n->rb_right;
518 	return n;
519 }
520 EXPORT_SYMBOL(rb_last);
521 
522 struct rb_node *rb_next(const struct rb_node *node)
523 {
524 	struct rb_node *parent;
525 
526 	if (RB_EMPTY_NODE(node))
527 		return NULL;
528 
529 	/*
530 	 * If we have a right-hand child, go down and then left as far
531 	 * as we can.
532 	 */
533 	if (node->rb_right) {
534 		node = node->rb_right;
535 		while (node->rb_left)
536 			node=node->rb_left;
537 		return (struct rb_node *)node;
538 	}
539 
540 	/*
541 	 * No right-hand children. Everything down and left is smaller than us,
542 	 * so any 'next' node must be in the general direction of our parent.
543 	 * Go up the tree; any time the ancestor is a right-hand child of its
544 	 * parent, keep going up. First time it's a left-hand child of its
545 	 * parent, said parent is our 'next' node.
546 	 */
547 	while ((parent = rb_parent(node)) && node == parent->rb_right)
548 		node = parent;
549 
550 	return parent;
551 }
552 EXPORT_SYMBOL(rb_next);
553 
554 struct rb_node *rb_prev(const struct rb_node *node)
555 {
556 	struct rb_node *parent;
557 
558 	if (RB_EMPTY_NODE(node))
559 		return NULL;
560 
561 	/*
562 	 * If we have a left-hand child, go down and then right as far
563 	 * as we can.
564 	 */
565 	if (node->rb_left) {
566 		node = node->rb_left;
567 		while (node->rb_right)
568 			node=node->rb_right;
569 		return (struct rb_node *)node;
570 	}
571 
572 	/*
573 	 * No left-hand children. Go up till we find an ancestor which
574 	 * is a right-hand child of its parent.
575 	 */
576 	while ((parent = rb_parent(node)) && node == parent->rb_left)
577 		node = parent;
578 
579 	return parent;
580 }
581 EXPORT_SYMBOL(rb_prev);
582 
583 void rb_replace_node(struct rb_node *victim, struct rb_node *new,
584 		     struct rb_root *root)
585 {
586 	struct rb_node *parent = rb_parent(victim);
587 
588 	/* Set the surrounding nodes to point to the replacement */
589 	if (parent) {
590 		if (victim == parent->rb_left)
591 			parent->rb_left = new;
592 		else
593 			parent->rb_right = new;
594 	} else {
595 		root->rb_node = new;
596 	}
597 	if (victim->rb_left)
598 		rb_set_parent(victim->rb_left, new);
599 	if (victim->rb_right)
600 		rb_set_parent(victim->rb_right, new);
601 
602 	/* Copy the pointers/colour from the victim to the replacement */
603 	*new = *victim;
604 }
605 EXPORT_SYMBOL(rb_replace_node);
606