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