rbtree: optimize fetching of sibling node
[firefly-linux-kernel-4.4.55.git] / lib / rbtree.c
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);