rbtree.c 16.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
  Red Black Trees
  (C) 1999  Andrea Arcangeli <andrea@suse.de>
  (C) 2002  David Woodhouse <dwmw2@infradead.org>
5 6
  (C) 2012  Michel Lespinasse <walken@google.com>

L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  linux/lib/rbtree.c
*/

24
#include <linux/rbtree_augmented.h>
25
#include <linux/export.h>
L
Linus Torvalds 已提交
26

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
/*
 * red-black trees properties:  http://en.wikipedia.org/wiki/Rbtree
 *
 *  1) A node is either red or black
 *  2) The root is black
 *  3) All leaves (NULL) are black
 *  4) Both children of every red node are black
 *  5) Every simple path from root to leaves contains the same number
 *     of black nodes.
 *
 *  4 and 5 give the O(log n) guarantee, since 4 implies you cannot have two
 *  consecutive red nodes in a path and every red node is therefore followed by
 *  a black. So if B is the number of black nodes on every simple path (as per
 *  5), then the longest possible path due to 4 is 2B.
 *
 *  We shall indicate color with case, where black nodes are uppercase and red
43 44
 *  nodes will be lowercase. Unknown color nodes shall be drawn as red within
 *  parentheses and have some accompanying text comment.
45 46
 */

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
/*
 * Notes on lockless lookups:
 *
 * All stores to the tree structure (rb_left and rb_right) must be done using
 * WRITE_ONCE(). And we must not inadvertently cause (temporary) loops in the
 * tree structure as seen in program order.
 *
 * These two requirements will allow lockless iteration of the tree -- not
 * correct iteration mind you, tree rotations are not atomic so a lookup might
 * miss entire subtrees.
 *
 * But they do guarantee that any such traversal will only see valid elements
 * and that it will indeed complete -- does not get stuck in a loop.
 *
 * It also guarantees that if the lookup returns an element it is the 'correct'
 * one. But not returning an element does _NOT_ mean it's not present.
 *
 * NOTE:
 *
 * Stores to __rb_parent_color are not important for simple lookups so those
 * are left undone as of now. Nor did I check for loops involving parent
 * pointers.
 */

71 72 73 74 75
static inline void rb_set_black(struct rb_node *rb)
{
	rb->__rb_parent_color |= RB_BLACK;
}

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
static inline struct rb_node *rb_red_parent(struct rb_node *red)
{
	return (struct rb_node *)red->__rb_parent_color;
}

/*
 * Helper function for rotations:
 * - old's parent and color get assigned to new
 * - old gets assigned new as a parent and 'color' as a color.
 */
static inline void
__rb_rotate_set_parents(struct rb_node *old, struct rb_node *new,
			struct rb_root *root, int color)
{
	struct rb_node *parent = rb_parent(old);
	new->__rb_parent_color = old->__rb_parent_color;
	rb_set_parent_color(old, new, color);
93
	__rb_change_child(old, new, parent, root);
94 95
}

96 97 98
static __always_inline void
__rb_insert(struct rb_node *node, struct rb_root *root,
	    void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
L
Linus Torvalds 已提交
99
{
100
	struct rb_node *parent = rb_red_parent(node), *gparent, *tmp;
L
Linus Torvalds 已提交
101

102 103 104 105 106 107 108 109 110
	while (true) {
		/*
		 * Loop invariant: node is red
		 *
		 * If there is a black parent, we are done.
		 * Otherwise, take some corrective action as we don't
		 * want a red root or two consecutive red nodes.
		 */
		if (!parent) {
111
			rb_set_parent_color(node, NULL, RB_BLACK);
112 113 114 115
			break;
		} else if (rb_is_black(parent))
			break;

116 117
		gparent = rb_red_parent(parent);

118 119
		tmp = gparent->rb_right;
		if (parent != tmp) {	/* parent == gparent->rb_left */
120 121 122 123 124 125 126 127
			if (tmp && rb_is_red(tmp)) {
				/*
				 * Case 1 - color flips
				 *
				 *       G            g
				 *      / \          / \
				 *     p   u  -->   P   U
				 *    /            /
128
				 *   n            n
129 130 131 132 133 134 135 136 137 138 139
				 *
				 * However, since g's parent might be red, and
				 * 4) does not allow this, we need to recurse
				 * at g.
				 */
				rb_set_parent_color(tmp, gparent, RB_BLACK);
				rb_set_parent_color(parent, gparent, RB_BLACK);
				node = gparent;
				parent = rb_parent(node);
				rb_set_parent_color(node, parent, RB_RED);
				continue;
L
Linus Torvalds 已提交
140 141
			}

142 143
			tmp = parent->rb_right;
			if (node == tmp) {
144 145 146 147 148 149 150 151 152 153 154 155
				/*
				 * Case 2 - left rotate at parent
				 *
				 *      G             G
				 *     / \           / \
				 *    p   U  -->    n   U
				 *     \           /
				 *      n         p
				 *
				 * This still leaves us in violation of 4), the
				 * continuation into Case 3 will fix that.
				 */
156 157 158
				tmp = node->rb_left;
				WRITE_ONCE(parent->rb_right, tmp);
				WRITE_ONCE(node->rb_left, parent);
159 160 161 162
				if (tmp)
					rb_set_parent_color(tmp, parent,
							    RB_BLACK);
				rb_set_parent_color(parent, node, RB_RED);
163
				augment_rotate(parent, node);
L
Linus Torvalds 已提交
164
				parent = node;
165
				tmp = node->rb_right;
L
Linus Torvalds 已提交
166 167
			}

168 169 170 171 172 173 174 175 176
			/*
			 * Case 3 - right rotate at gparent
			 *
			 *        G           P
			 *       / \         / \
			 *      p   U  -->  n   g
			 *     /                 \
			 *    n                   U
			 */
177 178
			WRITE_ONCE(gparent->rb_left, tmp); /* == parent->rb_right */
			WRITE_ONCE(parent->rb_right, gparent);
179 180 181
			if (tmp)
				rb_set_parent_color(tmp, gparent, RB_BLACK);
			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
182
			augment_rotate(gparent, parent);
183
			break;
L
Linus Torvalds 已提交
184
		} else {
185 186 187 188 189 190 191 192 193
			tmp = gparent->rb_left;
			if (tmp && rb_is_red(tmp)) {
				/* Case 1 - color flips */
				rb_set_parent_color(tmp, gparent, RB_BLACK);
				rb_set_parent_color(parent, gparent, RB_BLACK);
				node = gparent;
				parent = rb_parent(node);
				rb_set_parent_color(node, parent, RB_RED);
				continue;
L
Linus Torvalds 已提交
194 195
			}

196 197
			tmp = parent->rb_left;
			if (node == tmp) {
198
				/* Case 2 - right rotate at parent */
199 200 201
				tmp = node->rb_right;
				WRITE_ONCE(parent->rb_left, tmp);
				WRITE_ONCE(node->rb_right, parent);
202 203 204 205
				if (tmp)
					rb_set_parent_color(tmp, parent,
							    RB_BLACK);
				rb_set_parent_color(parent, node, RB_RED);
206
				augment_rotate(parent, node);
L
Linus Torvalds 已提交
207
				parent = node;
208
				tmp = node->rb_left;
L
Linus Torvalds 已提交
209 210
			}

211
			/* Case 3 - left rotate at gparent */
212 213
			WRITE_ONCE(gparent->rb_right, tmp); /* == parent->rb_left */
			WRITE_ONCE(parent->rb_left, gparent);
214 215 216
			if (tmp)
				rb_set_parent_color(tmp, gparent, RB_BLACK);
			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
217
			augment_rotate(gparent, parent);
218
			break;
L
Linus Torvalds 已提交
219 220 221 222
		}
	}
}

223 224 225 226 227 228
/*
 * Inline version for rb_erase() use - we want to be able to inline
 * and eliminate the dummy_rotate callback there
 */
static __always_inline void
____rb_erase_color(struct rb_node *parent, struct rb_root *root,
229
	void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
L
Linus Torvalds 已提交
230
{
231
	struct rb_node *node = NULL, *sibling, *tmp1, *tmp2;
L
Linus Torvalds 已提交
232

233 234
	while (true) {
		/*
235 236 237 238 239
		 * Loop invariants:
		 * - node is black (or NULL on first iteration)
		 * - node is not the root (parent is not NULL)
		 * - All leaf paths going through parent and node have a
		 *   black node count that is 1 lower than other leaf paths.
240
		 */
241 242
		sibling = parent->rb_right;
		if (node != sibling) {	/* node == parent->rb_left */
243 244 245 246 247 248 249 250 251 252
			if (rb_is_red(sibling)) {
				/*
				 * Case 1 - left rotate at parent
				 *
				 *     P               S
				 *    / \             / \
				 *   N   s    -->    p   Sr
				 *      / \         / \
				 *     Sl  Sr      N   Sl
				 */
253 254 255
				tmp1 = sibling->rb_left;
				WRITE_ONCE(parent->rb_right, tmp1);
				WRITE_ONCE(sibling->rb_left, parent);
256 257 258
				rb_set_parent_color(tmp1, parent, RB_BLACK);
				__rb_rotate_set_parents(parent, sibling, root,
							RB_RED);
259
				augment_rotate(parent, sibling);
260
				sibling = tmp1;
L
Linus Torvalds 已提交
261
			}
262 263 264 265 266 267 268 269 270 271 272 273 274 275
			tmp1 = sibling->rb_right;
			if (!tmp1 || rb_is_black(tmp1)) {
				tmp2 = sibling->rb_left;
				if (!tmp2 || rb_is_black(tmp2)) {
					/*
					 * Case 2 - sibling color flip
					 * (p could be either color here)
					 *
					 *    (p)           (p)
					 *    / \           / \
					 *   N   S    -->  N   s
					 *      / \           / \
					 *     Sl  Sr        Sl  Sr
					 *
276 277 278 279
					 * This leaves us violating 5) which
					 * can be fixed by flipping p to black
					 * if it was red, or by recursing at p.
					 * p is red when coming from Case 1.
280 281 282
					 */
					rb_set_parent_color(sibling, parent,
							    RB_RED);
283 284 285 286 287 288 289 290 291
					if (rb_is_red(parent))
						rb_set_black(parent);
					else {
						node = parent;
						parent = rb_parent(node);
						if (parent)
							continue;
					}
					break;
L
Linus Torvalds 已提交
292
				}
293 294 295 296 297 298 299 300 301 302 303 304
				/*
				 * Case 3 - right rotate at sibling
				 * (p could be either color here)
				 *
				 *   (p)           (p)
				 *   / \           / \
				 *  N   S    -->  N   Sl
				 *     / \             \
				 *    sl  Sr            s
				 *                       \
				 *                        Sr
				 */
305 306 307 308
				tmp1 = tmp2->rb_right;
				WRITE_ONCE(sibling->rb_left, tmp1);
				WRITE_ONCE(tmp2->rb_right, sibling);
				WRITE_ONCE(parent->rb_right, tmp2);
309 310 311
				if (tmp1)
					rb_set_parent_color(tmp1, sibling,
							    RB_BLACK);
312
				augment_rotate(sibling, tmp2);
313 314
				tmp1 = sibling;
				sibling = tmp2;
L
Linus Torvalds 已提交
315
			}
316 317 318 319 320 321 322 323 324 325 326 327
			/*
			 * Case 4 - left rotate at parent + color flips
			 * (p and sl could be either color here.
			 *  After rotation, p becomes black, s acquires
			 *  p's color, and sl keeps its color)
			 *
			 *      (p)             (s)
			 *      / \             / \
			 *     N   S     -->   P   Sr
			 *        / \         / \
			 *      (sl) sr      N  (sl)
			 */
328 329 330
			tmp2 = sibling->rb_left;
			WRITE_ONCE(parent->rb_right, tmp2);
			WRITE_ONCE(sibling->rb_left, parent);
331 332 333 334 335
			rb_set_parent_color(tmp1, sibling, RB_BLACK);
			if (tmp2)
				rb_set_parent(tmp2, parent);
			__rb_rotate_set_parents(parent, sibling, root,
						RB_BLACK);
336
			augment_rotate(parent, sibling);
337
			break;
338
		} else {
339 340 341
			sibling = parent->rb_left;
			if (rb_is_red(sibling)) {
				/* Case 1 - right rotate at parent */
342 343 344
				tmp1 = sibling->rb_right;
				WRITE_ONCE(parent->rb_left, tmp1);
				WRITE_ONCE(sibling->rb_right, parent);
345 346 347
				rb_set_parent_color(tmp1, parent, RB_BLACK);
				__rb_rotate_set_parents(parent, sibling, root,
							RB_RED);
348
				augment_rotate(parent, sibling);
349
				sibling = tmp1;
L
Linus Torvalds 已提交
350
			}
351 352 353 354 355 356 357
			tmp1 = sibling->rb_left;
			if (!tmp1 || rb_is_black(tmp1)) {
				tmp2 = sibling->rb_right;
				if (!tmp2 || rb_is_black(tmp2)) {
					/* Case 2 - sibling color flip */
					rb_set_parent_color(sibling, parent,
							    RB_RED);
358 359 360 361 362 363 364 365 366
					if (rb_is_red(parent))
						rb_set_black(parent);
					else {
						node = parent;
						parent = rb_parent(node);
						if (parent)
							continue;
					}
					break;
L
Linus Torvalds 已提交
367
				}
368
				/* Case 3 - right rotate at sibling */
369 370 371 372
				tmp1 = tmp2->rb_left;
				WRITE_ONCE(sibling->rb_right, tmp1);
				WRITE_ONCE(tmp2->rb_left, sibling);
				WRITE_ONCE(parent->rb_left, tmp2);
373 374 375
				if (tmp1)
					rb_set_parent_color(tmp1, sibling,
							    RB_BLACK);
376
				augment_rotate(sibling, tmp2);
377 378
				tmp1 = sibling;
				sibling = tmp2;
L
Linus Torvalds 已提交
379
			}
380
			/* Case 4 - left rotate at parent + color flips */
381 382 383
			tmp2 = sibling->rb_right;
			WRITE_ONCE(parent->rb_left, tmp2);
			WRITE_ONCE(sibling->rb_right, parent);
384 385 386 387 388
			rb_set_parent_color(tmp1, sibling, RB_BLACK);
			if (tmp2)
				rb_set_parent(tmp2, parent);
			__rb_rotate_set_parents(parent, sibling, root,
						RB_BLACK);
389
			augment_rotate(parent, sibling);
390
			break;
L
Linus Torvalds 已提交
391 392 393
		}
	}
}
394 395 396 397 398 399 400

/* Non-inline version for rb_erase_augmented() use */
void __rb_erase_color(struct rb_node *parent, struct rb_root *root,
	void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
{
	____rb_erase_color(parent, root, augment_rotate);
}
401
EXPORT_SYMBOL(__rb_erase_color);
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425

/*
 * Non-augmented rbtree manipulation functions.
 *
 * We use dummy augmented callbacks here, and have the compiler optimize them
 * out of the rb_insert_color() and rb_erase() function definitions.
 */

static inline void dummy_propagate(struct rb_node *node, struct rb_node *stop) {}
static inline void dummy_copy(struct rb_node *old, struct rb_node *new) {}
static inline void dummy_rotate(struct rb_node *old, struct rb_node *new) {}

static const struct rb_augment_callbacks dummy_callbacks = {
	dummy_propagate, dummy_copy, dummy_rotate
};

void rb_insert_color(struct rb_node *node, struct rb_root *root)
{
	__rb_insert(node, root, dummy_rotate);
}
EXPORT_SYMBOL(rb_insert_color);

void rb_erase(struct rb_node *node, struct rb_root *root)
{
426 427 428 429
	struct rb_node *rebalance;
	rebalance = __rb_erase_augmented(node, root, &dummy_callbacks);
	if (rebalance)
		____rb_erase_color(rebalance, root, dummy_rotate);
L
Linus Torvalds 已提交
430 431 432
}
EXPORT_SYMBOL(rb_erase);

433 434 435 436 437 438 439 440 441 442 443 444 445 446
/*
 * Augmented rbtree manipulation functions.
 *
 * This instantiates the same __always_inline functions as in the non-augmented
 * case, but this time with user-defined callbacks.
 */

void __rb_insert_augmented(struct rb_node *node, struct rb_root *root,
	void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
{
	__rb_insert(node, root, augment_rotate);
}
EXPORT_SYMBOL(__rb_insert_augmented);

L
Linus Torvalds 已提交
447 448 449
/*
 * This function returns the first node (in sort order) of the tree.
 */
450
struct rb_node *rb_first(const struct rb_root *root)
L
Linus Torvalds 已提交
451 452 453 454 455 456 457 458 459 460 461 462
{
	struct rb_node	*n;

	n = root->rb_node;
	if (!n)
		return NULL;
	while (n->rb_left)
		n = n->rb_left;
	return n;
}
EXPORT_SYMBOL(rb_first);

463
struct rb_node *rb_last(const struct rb_root *root)
L
Linus Torvalds 已提交
464 465 466 467 468 469 470 471 472 473 474 475
{
	struct rb_node	*n;

	n = root->rb_node;
	if (!n)
		return NULL;
	while (n->rb_right)
		n = n->rb_right;
	return n;
}
EXPORT_SYMBOL(rb_last);

476
struct rb_node *rb_next(const struct rb_node *node)
L
Linus Torvalds 已提交
477
{
478 479
	struct rb_node *parent;

480
	if (RB_EMPTY_NODE(node))
481 482
		return NULL;

483 484 485 486
	/*
	 * If we have a right-hand child, go down and then left as far
	 * as we can.
	 */
L
Linus Torvalds 已提交
487 488 489 490
	if (node->rb_right) {
		node = node->rb_right; 
		while (node->rb_left)
			node=node->rb_left;
491
		return (struct rb_node *)node;
L
Linus Torvalds 已提交
492 493
	}

494 495 496 497 498 499 500
	/*
	 * No right-hand children. Everything down and left is smaller than us,
	 * so any 'next' node must be in the general direction of our parent.
	 * Go up the tree; any time the ancestor is a right-hand child of its
	 * parent, keep going up. First time it's a left-hand child of its
	 * parent, said parent is our 'next' node.
	 */
501 502
	while ((parent = rb_parent(node)) && node == parent->rb_right)
		node = parent;
L
Linus Torvalds 已提交
503

504
	return parent;
L
Linus Torvalds 已提交
505 506 507
}
EXPORT_SYMBOL(rb_next);

508
struct rb_node *rb_prev(const struct rb_node *node)
L
Linus Torvalds 已提交
509
{
510 511
	struct rb_node *parent;

512
	if (RB_EMPTY_NODE(node))
513 514
		return NULL;

515 516 517 518
	/*
	 * If we have a left-hand child, go down and then right as far
	 * as we can.
	 */
L
Linus Torvalds 已提交
519 520 521 522
	if (node->rb_left) {
		node = node->rb_left; 
		while (node->rb_right)
			node=node->rb_right;
523
		return (struct rb_node *)node;
L
Linus Torvalds 已提交
524 525
	}

526 527 528 529
	/*
	 * No left-hand children. Go up till we find an ancestor which
	 * is a right-hand child of its parent.
	 */
530 531
	while ((parent = rb_parent(node)) && node == parent->rb_left)
		node = parent;
L
Linus Torvalds 已提交
532

533
	return parent;
L
Linus Torvalds 已提交
534 535 536 537 538 539
}
EXPORT_SYMBOL(rb_prev);

void rb_replace_node(struct rb_node *victim, struct rb_node *new,
		     struct rb_root *root)
{
540
	struct rb_node *parent = rb_parent(victim);
L
Linus Torvalds 已提交
541 542

	/* Set the surrounding nodes to point to the replacement */
543
	__rb_change_child(victim, new, parent, root);
L
Linus Torvalds 已提交
544
	if (victim->rb_left)
545
		rb_set_parent(victim->rb_left, new);
L
Linus Torvalds 已提交
546
	if (victim->rb_right)
547
		rb_set_parent(victim->rb_right, new);
L
Linus Torvalds 已提交
548 549 550 551 552

	/* Copy the pointers/colour from the victim to the replacement */
	*new = *victim;
}
EXPORT_SYMBOL(rb_replace_node);
553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592

static struct rb_node *rb_left_deepest_node(const struct rb_node *node)
{
	for (;;) {
		if (node->rb_left)
			node = node->rb_left;
		else if (node->rb_right)
			node = node->rb_right;
		else
			return (struct rb_node *)node;
	}
}

struct rb_node *rb_next_postorder(const struct rb_node *node)
{
	const struct rb_node *parent;
	if (!node)
		return NULL;
	parent = rb_parent(node);

	/* If we're sitting on node, we've already seen our children */
	if (parent && node == parent->rb_left && parent->rb_right) {
		/* If we are the parent's left node, go to the parent's right
		 * node then all the way down to the left */
		return rb_left_deepest_node(parent->rb_right);
	} else
		/* Otherwise we are the parent's right node, and the parent
		 * should be next */
		return (struct rb_node *)parent;
}
EXPORT_SYMBOL(rb_next_postorder);

struct rb_node *rb_first_postorder(const struct rb_root *root)
{
	if (!root->rb_node)
		return NULL;

	return rb_left_deepest_node(root->rb_node);
}
EXPORT_SYMBOL(rb_first_postorder);