0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/rbtree_augmented.h>
0013 #include <linux/export.h>
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 static inline void rb_set_black(struct rb_node *rb)
0060 {
0061 rb->__rb_parent_color |= RB_BLACK;
0062 }
0063
0064 static inline struct rb_node *rb_red_parent(struct rb_node *red)
0065 {
0066 return (struct rb_node *)red->__rb_parent_color;
0067 }
0068
0069
0070
0071
0072
0073
0074 static inline void
0075 __rb_rotate_set_parents(struct rb_node *old, struct rb_node *new,
0076 struct rb_root *root, int color)
0077 {
0078 struct rb_node *parent = rb_parent(old);
0079 new->__rb_parent_color = old->__rb_parent_color;
0080 rb_set_parent_color(old, new, color);
0081 __rb_change_child(old, new, parent, root);
0082 }
0083
0084 static __always_inline void
0085 __rb_insert(struct rb_node *node, struct rb_root *root,
0086 void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
0087 {
0088 struct rb_node *parent = rb_red_parent(node), *gparent, *tmp;
0089
0090 while (true) {
0091
0092
0093
0094 if (unlikely(!parent)) {
0095
0096
0097
0098
0099
0100 rb_set_parent_color(node, NULL, RB_BLACK);
0101 break;
0102 }
0103
0104
0105
0106
0107
0108
0109
0110 if(rb_is_black(parent))
0111 break;
0112
0113 gparent = rb_red_parent(parent);
0114
0115 tmp = gparent->rb_right;
0116 if (parent != tmp) {
0117 if (tmp && rb_is_red(tmp)) {
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131 rb_set_parent_color(tmp, gparent, RB_BLACK);
0132 rb_set_parent_color(parent, gparent, RB_BLACK);
0133 node = gparent;
0134 parent = rb_parent(node);
0135 rb_set_parent_color(node, parent, RB_RED);
0136 continue;
0137 }
0138
0139 tmp = parent->rb_right;
0140 if (node == tmp) {
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154 tmp = node->rb_left;
0155 WRITE_ONCE(parent->rb_right, tmp);
0156 WRITE_ONCE(node->rb_left, parent);
0157 if (tmp)
0158 rb_set_parent_color(tmp, parent,
0159 RB_BLACK);
0160 rb_set_parent_color(parent, node, RB_RED);
0161 augment_rotate(parent, node);
0162 parent = node;
0163 tmp = node->rb_right;
0164 }
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176 WRITE_ONCE(gparent->rb_left, tmp);
0177 WRITE_ONCE(parent->rb_right, gparent);
0178 if (tmp)
0179 rb_set_parent_color(tmp, gparent, RB_BLACK);
0180 __rb_rotate_set_parents(gparent, parent, root, RB_RED);
0181 augment_rotate(gparent, parent);
0182 break;
0183 } else {
0184 tmp = gparent->rb_left;
0185 if (tmp && rb_is_red(tmp)) {
0186
0187 rb_set_parent_color(tmp, gparent, RB_BLACK);
0188 rb_set_parent_color(parent, gparent, RB_BLACK);
0189 node = gparent;
0190 parent = rb_parent(node);
0191 rb_set_parent_color(node, parent, RB_RED);
0192 continue;
0193 }
0194
0195 tmp = parent->rb_left;
0196 if (node == tmp) {
0197
0198 tmp = node->rb_right;
0199 WRITE_ONCE(parent->rb_left, tmp);
0200 WRITE_ONCE(node->rb_right, parent);
0201 if (tmp)
0202 rb_set_parent_color(tmp, parent,
0203 RB_BLACK);
0204 rb_set_parent_color(parent, node, RB_RED);
0205 augment_rotate(parent, node);
0206 parent = node;
0207 tmp = node->rb_left;
0208 }
0209
0210
0211 WRITE_ONCE(gparent->rb_right, tmp);
0212 WRITE_ONCE(parent->rb_left, gparent);
0213 if (tmp)
0214 rb_set_parent_color(tmp, gparent, RB_BLACK);
0215 __rb_rotate_set_parents(gparent, parent, root, RB_RED);
0216 augment_rotate(gparent, parent);
0217 break;
0218 }
0219 }
0220 }
0221
0222
0223
0224
0225
0226 static __always_inline void
0227 ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
0228 void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
0229 {
0230 struct rb_node *node = NULL, *sibling, *tmp1, *tmp2;
0231
0232 while (true) {
0233
0234
0235
0236
0237
0238
0239
0240 sibling = parent->rb_right;
0241 if (node != sibling) {
0242 if (rb_is_red(sibling)) {
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252 tmp1 = sibling->rb_left;
0253 WRITE_ONCE(parent->rb_right, tmp1);
0254 WRITE_ONCE(sibling->rb_left, parent);
0255 rb_set_parent_color(tmp1, parent, RB_BLACK);
0256 __rb_rotate_set_parents(parent, sibling, root,
0257 RB_RED);
0258 augment_rotate(parent, sibling);
0259 sibling = tmp1;
0260 }
0261 tmp1 = sibling->rb_right;
0262 if (!tmp1 || rb_is_black(tmp1)) {
0263 tmp2 = sibling->rb_left;
0264 if (!tmp2 || rb_is_black(tmp2)) {
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 rb_set_parent_color(sibling, parent,
0281 RB_RED);
0282 if (rb_is_red(parent))
0283 rb_set_black(parent);
0284 else {
0285 node = parent;
0286 parent = rb_parent(node);
0287 if (parent)
0288 continue;
0289 }
0290 break;
0291 }
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 tmp1 = tmp2->rb_right;
0320 WRITE_ONCE(sibling->rb_left, tmp1);
0321 WRITE_ONCE(tmp2->rb_right, sibling);
0322 WRITE_ONCE(parent->rb_right, tmp2);
0323 if (tmp1)
0324 rb_set_parent_color(tmp1, sibling,
0325 RB_BLACK);
0326 augment_rotate(sibling, tmp2);
0327 tmp1 = sibling;
0328 sibling = tmp2;
0329 }
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342 tmp2 = sibling->rb_left;
0343 WRITE_ONCE(parent->rb_right, tmp2);
0344 WRITE_ONCE(sibling->rb_left, parent);
0345 rb_set_parent_color(tmp1, sibling, RB_BLACK);
0346 if (tmp2)
0347 rb_set_parent(tmp2, parent);
0348 __rb_rotate_set_parents(parent, sibling, root,
0349 RB_BLACK);
0350 augment_rotate(parent, sibling);
0351 break;
0352 } else {
0353 sibling = parent->rb_left;
0354 if (rb_is_red(sibling)) {
0355
0356 tmp1 = sibling->rb_right;
0357 WRITE_ONCE(parent->rb_left, tmp1);
0358 WRITE_ONCE(sibling->rb_right, parent);
0359 rb_set_parent_color(tmp1, parent, RB_BLACK);
0360 __rb_rotate_set_parents(parent, sibling, root,
0361 RB_RED);
0362 augment_rotate(parent, sibling);
0363 sibling = tmp1;
0364 }
0365 tmp1 = sibling->rb_left;
0366 if (!tmp1 || rb_is_black(tmp1)) {
0367 tmp2 = sibling->rb_right;
0368 if (!tmp2 || rb_is_black(tmp2)) {
0369
0370 rb_set_parent_color(sibling, parent,
0371 RB_RED);
0372 if (rb_is_red(parent))
0373 rb_set_black(parent);
0374 else {
0375 node = parent;
0376 parent = rb_parent(node);
0377 if (parent)
0378 continue;
0379 }
0380 break;
0381 }
0382
0383 tmp1 = tmp2->rb_left;
0384 WRITE_ONCE(sibling->rb_right, tmp1);
0385 WRITE_ONCE(tmp2->rb_left, sibling);
0386 WRITE_ONCE(parent->rb_left, tmp2);
0387 if (tmp1)
0388 rb_set_parent_color(tmp1, sibling,
0389 RB_BLACK);
0390 augment_rotate(sibling, tmp2);
0391 tmp1 = sibling;
0392 sibling = tmp2;
0393 }
0394
0395 tmp2 = sibling->rb_right;
0396 WRITE_ONCE(parent->rb_left, tmp2);
0397 WRITE_ONCE(sibling->rb_right, parent);
0398 rb_set_parent_color(tmp1, sibling, RB_BLACK);
0399 if (tmp2)
0400 rb_set_parent(tmp2, parent);
0401 __rb_rotate_set_parents(parent, sibling, root,
0402 RB_BLACK);
0403 augment_rotate(parent, sibling);
0404 break;
0405 }
0406 }
0407 }
0408
0409
0410 void __rb_erase_color(struct rb_node *parent, struct rb_root *root,
0411 void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
0412 {
0413 ____rb_erase_color(parent, root, augment_rotate);
0414 }
0415
0416
0417
0418
0419
0420
0421
0422
0423 static inline void dummy_propagate(struct rb_node *node, struct rb_node *stop) {}
0424 static inline void dummy_copy(struct rb_node *old, struct rb_node *new) {}
0425 static inline void dummy_rotate(struct rb_node *old, struct rb_node *new) {}
0426
0427 static const struct rb_augment_callbacks dummy_callbacks = {
0428 .propagate = dummy_propagate,
0429 .copy = dummy_copy,
0430 .rotate = dummy_rotate
0431 };
0432
0433 void rb_insert_color(struct rb_node *node, struct rb_root *root)
0434 {
0435 __rb_insert(node, root, dummy_rotate);
0436 }
0437
0438 void rb_erase(struct rb_node *node, struct rb_root *root)
0439 {
0440 struct rb_node *rebalance;
0441 rebalance = __rb_erase_augmented(node, root, &dummy_callbacks);
0442 if (rebalance)
0443 ____rb_erase_color(rebalance, root, dummy_rotate);
0444 }
0445
0446
0447
0448
0449
0450
0451
0452
0453 void __rb_insert_augmented(struct rb_node *node, struct rb_root *root,
0454 void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
0455 {
0456 __rb_insert(node, root, augment_rotate);
0457 }
0458
0459
0460
0461
0462 struct rb_node *rb_first(const struct rb_root *root)
0463 {
0464 struct rb_node *n;
0465
0466 n = root->rb_node;
0467 if (!n)
0468 return NULL;
0469 while (n->rb_left)
0470 n = n->rb_left;
0471 return n;
0472 }
0473
0474 struct rb_node *rb_last(const struct rb_root *root)
0475 {
0476 struct rb_node *n;
0477
0478 n = root->rb_node;
0479 if (!n)
0480 return NULL;
0481 while (n->rb_right)
0482 n = n->rb_right;
0483 return n;
0484 }
0485
0486 struct rb_node *rb_next(const struct rb_node *node)
0487 {
0488 struct rb_node *parent;
0489
0490 if (RB_EMPTY_NODE(node))
0491 return NULL;
0492
0493
0494
0495
0496
0497 if (node->rb_right) {
0498 node = node->rb_right;
0499 while (node->rb_left)
0500 node = node->rb_left;
0501 return (struct rb_node *)node;
0502 }
0503
0504
0505
0506
0507
0508
0509
0510
0511 while ((parent = rb_parent(node)) && node == parent->rb_right)
0512 node = parent;
0513
0514 return parent;
0515 }
0516
0517 struct rb_node *rb_prev(const struct rb_node *node)
0518 {
0519 struct rb_node *parent;
0520
0521 if (RB_EMPTY_NODE(node))
0522 return NULL;
0523
0524
0525
0526
0527
0528 if (node->rb_left) {
0529 node = node->rb_left;
0530 while (node->rb_right)
0531 node = node->rb_right;
0532 return (struct rb_node *)node;
0533 }
0534
0535
0536
0537
0538
0539 while ((parent = rb_parent(node)) && node == parent->rb_left)
0540 node = parent;
0541
0542 return parent;
0543 }
0544
0545 void rb_replace_node(struct rb_node *victim, struct rb_node *new,
0546 struct rb_root *root)
0547 {
0548 struct rb_node *parent = rb_parent(victim);
0549
0550
0551 *new = *victim;
0552
0553
0554 if (victim->rb_left)
0555 rb_set_parent(victim->rb_left, new);
0556 if (victim->rb_right)
0557 rb_set_parent(victim->rb_right, new);
0558 __rb_change_child(victim, new, parent, root);
0559 }
0560
0561 static struct rb_node *rb_left_deepest_node(const struct rb_node *node)
0562 {
0563 for (;;) {
0564 if (node->rb_left)
0565 node = node->rb_left;
0566 else if (node->rb_right)
0567 node = node->rb_right;
0568 else
0569 return (struct rb_node *)node;
0570 }
0571 }
0572
0573 struct rb_node *rb_next_postorder(const struct rb_node *node)
0574 {
0575 const struct rb_node *parent;
0576 if (!node)
0577 return NULL;
0578 parent = rb_parent(node);
0579
0580
0581 if (parent && node == parent->rb_left && parent->rb_right) {
0582
0583
0584 return rb_left_deepest_node(parent->rb_right);
0585 } else
0586
0587
0588 return (struct rb_node *)parent;
0589 }
0590
0591 struct rb_node *rb_first_postorder(const struct rb_root *root)
0592 {
0593 if (!root->rb_node)
0594 return NULL;
0595
0596 return rb_left_deepest_node(root->rb_node);
0597 }