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