xref: /dragonfly/contrib/dhcpcd/compat/rb.c (revision e5a92d33)
1 /*	$NetBSD: rb.c,v 1.14 2019/03/08 09:14:54 roy Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Matt Thomas <matt@3am-software.com>.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include "config.h"
33 #include "common.h"
34 
35 #if !defined(_KERNEL) && !defined(_STANDALONE)
36 #include <sys/types.h>
37 #include <stddef.h>
38 #include <assert.h>
39 #include <stdbool.h>
40 #ifdef RBDEBUG
41 #define	KASSERT(s)	assert(s)
42 #define	__rbt_unused
43 #else
44 #define KASSERT(s)	do { } while (/*CONSTCOND*/ 0)
45 #define	__rbt_unused	__unused
46 #endif
47 __RCSID("$NetBSD: rb.c,v 1.14 2019/03/08 09:14:54 roy Exp $");
48 #else
49 #include <lib/libkern/libkern.h>
50 __KERNEL_RCSID(0, "$NetBSD: rb.c,v 1.14 2019/03/08 09:14:54 roy Exp $");
51 #ifndef DIAGNOSTIC
52 #define	__rbt_unused	__unused
53 #else
54 #define	__rbt_unused
55 #endif
56 #endif
57 
58 #ifdef _LIBC
59 __weak_alias(rb_tree_init, _rb_tree_init)
60 __weak_alias(rb_tree_find_node, _rb_tree_find_node)
61 __weak_alias(rb_tree_find_node_geq, _rb_tree_find_node_geq)
62 __weak_alias(rb_tree_find_node_leq, _rb_tree_find_node_leq)
63 __weak_alias(rb_tree_insert_node, _rb_tree_insert_node)
64 __weak_alias(rb_tree_remove_node, _rb_tree_remove_node)
65 __weak_alias(rb_tree_iterate, _rb_tree_iterate)
66 #ifdef RBDEBUG
67 __weak_alias(rb_tree_check, _rb_tree_check)
68 __weak_alias(rb_tree_depths, _rb_tree_depths)
69 #endif
70 
71 #include "namespace.h"
72 #endif
73 
74 #ifdef RBTEST
75 #include "rbtree.h"
76 #else
77 #include <sys/rbtree.h>
78 #endif
79 
80 static void rb_tree_insert_rebalance(struct rb_tree *, struct rb_node *);
81 static void rb_tree_removal_rebalance(struct rb_tree *, struct rb_node *,
82 	unsigned int);
83 #ifdef RBDEBUG
84 static const struct rb_node *rb_tree_iterate_const(const struct rb_tree *,
85 	const struct rb_node *, const unsigned int);
86 static bool rb_tree_check_node(const struct rb_tree *, const struct rb_node *,
87 	const struct rb_node *, bool);
88 #else
89 #define	rb_tree_check_node(a, b, c, d)	true
90 #endif
91 
92 #define	RB_NODETOITEM(rbto, rbn)	\
93     ((void *)((uintptr_t)(rbn) - (rbto)->rbto_node_offset))
94 #define	RB_ITEMTONODE(rbto, rbn)	\
95     ((rb_node_t *)((uintptr_t)(rbn) + (rbto)->rbto_node_offset))
96 
97 #define	RB_SENTINEL_NODE	NULL
98 
99 void
100 rb_tree_init(struct rb_tree *rbt, const rb_tree_ops_t *ops)
101 {
102 
103 	rbt->rbt_ops = ops;
104 	rbt->rbt_root = RB_SENTINEL_NODE;
105 	RB_TAILQ_INIT(&rbt->rbt_nodes);
106 #ifndef RBSMALL
107 	rbt->rbt_minmax[RB_DIR_LEFT] = rbt->rbt_root;	/* minimum node */
108 	rbt->rbt_minmax[RB_DIR_RIGHT] = rbt->rbt_root;	/* maximum node */
109 #endif
110 #ifdef RBSTATS
111 	rbt->rbt_count = 0;
112 	rbt->rbt_insertions = 0;
113 	rbt->rbt_removals = 0;
114 	rbt->rbt_insertion_rebalance_calls = 0;
115 	rbt->rbt_insertion_rebalance_passes = 0;
116 	rbt->rbt_removal_rebalance_calls = 0;
117 	rbt->rbt_removal_rebalance_passes = 0;
118 #endif
119 }
120 
121 void *
122 rb_tree_find_node(struct rb_tree *rbt, const void *key)
123 {
124 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
125 	rbto_compare_key_fn compare_key = rbto->rbto_compare_key;
126 	struct rb_node *parent = rbt->rbt_root;
127 
128 	while (!RB_SENTINEL_P(parent)) {
129 		void *pobj = RB_NODETOITEM(rbto, parent);
130 		const signed int diff = (*compare_key)(rbto->rbto_context,
131 		    pobj, key);
132 		if (diff == 0)
133 			return pobj;
134 		parent = parent->rb_nodes[diff < 0];
135 	}
136 
137 	return NULL;
138 }
139 
140 void *
141 rb_tree_find_node_geq(struct rb_tree *rbt, const void *key)
142 {
143 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
144 	rbto_compare_key_fn compare_key = rbto->rbto_compare_key;
145 	struct rb_node *parent = rbt->rbt_root, *last = NULL;
146 
147 	while (!RB_SENTINEL_P(parent)) {
148 		void *pobj = RB_NODETOITEM(rbto, parent);
149 		const signed int diff = (*compare_key)(rbto->rbto_context,
150 		    pobj, key);
151 		if (diff == 0)
152 			return pobj;
153 		if (diff > 0)
154 			last = parent;
155 		parent = parent->rb_nodes[diff < 0];
156 	}
157 
158 	return last == NULL ? NULL : RB_NODETOITEM(rbto, last);
159 }
160 
161 void *
162 rb_tree_find_node_leq(struct rb_tree *rbt, const void *key)
163 {
164 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
165 	rbto_compare_key_fn compare_key = rbto->rbto_compare_key;
166 	struct rb_node *parent = rbt->rbt_root, *last = NULL;
167 
168 	while (!RB_SENTINEL_P(parent)) {
169 		void *pobj = RB_NODETOITEM(rbto, parent);
170 		const signed int diff = (*compare_key)(rbto->rbto_context,
171 		    pobj, key);
172 		if (diff == 0)
173 			return pobj;
174 		if (diff < 0)
175 			last = parent;
176 		parent = parent->rb_nodes[diff < 0];
177 	}
178 
179 	return last == NULL ? NULL : RB_NODETOITEM(rbto, last);
180 }
181 
182 void *
183 rb_tree_insert_node(struct rb_tree *rbt, void *object)
184 {
185 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
186 	rbto_compare_nodes_fn compare_nodes = rbto->rbto_compare_nodes;
187 	struct rb_node *parent, *tmp, *self = RB_ITEMTONODE(rbto, object);
188 	unsigned int position;
189 	bool rebalance;
190 
191 	RBSTAT_INC(rbt->rbt_insertions);
192 
193 	tmp = rbt->rbt_root;
194 	/*
195 	 * This is a hack.  Because rbt->rbt_root is just a struct rb_node *,
196 	 * just like rb_node->rb_nodes[RB_DIR_LEFT], we can use this fact to
197 	 * avoid a lot of tests for root and know that even at root,
198 	 * updating RB_FATHER(rb_node)->rb_nodes[RB_POSITION(rb_node)] will
199 	 * update rbt->rbt_root.
200 	 */
201 	parent = (struct rb_node *)(void *)&rbt->rbt_root;
202 	position = RB_DIR_LEFT;
203 
204 	/*
205 	 * Find out where to place this new leaf.
206 	 */
207 	while (!RB_SENTINEL_P(tmp)) {
208 		void *tobj = RB_NODETOITEM(rbto, tmp);
209 		const signed int diff = (*compare_nodes)(rbto->rbto_context,
210 		    tobj, object);
211 		if (__predict_false(diff == 0)) {
212 			/*
213 			 * Node already exists; return it.
214 			 */
215 			return tobj;
216 		}
217 		parent = tmp;
218 		position = (diff < 0);
219 		tmp = parent->rb_nodes[position];
220 	}
221 
222 #ifdef RBDEBUG
223 	{
224 		struct rb_node *prev = NULL, *next = NULL;
225 
226 		if (position == RB_DIR_RIGHT)
227 			prev = parent;
228 		else if (tmp != rbt->rbt_root)
229 			next = parent;
230 
231 		/*
232 		 * Verify our sequential position
233 		 */
234 		KASSERT(prev == NULL || !RB_SENTINEL_P(prev));
235 		KASSERT(next == NULL || !RB_SENTINEL_P(next));
236 		if (prev != NULL && next == NULL)
237 			next = TAILQ_NEXT(prev, rb_link);
238 		if (prev == NULL && next != NULL)
239 			prev = TAILQ_PREV(next, rb_node_qh, rb_link);
240 		KASSERT(prev == NULL || !RB_SENTINEL_P(prev));
241 		KASSERT(next == NULL || !RB_SENTINEL_P(next));
242 		KASSERT(prev == NULL || (*compare_nodes)(rbto->rbto_context,
243 		    RB_NODETOITEM(rbto, prev), RB_NODETOITEM(rbto, self)) < 0);
244 		KASSERT(next == NULL || (*compare_nodes)(rbto->rbto_context,
245 		    RB_NODETOITEM(rbto, self), RB_NODETOITEM(rbto, next)) < 0);
246 	}
247 #endif
248 
249 	/*
250 	 * Initialize the node and insert as a leaf into the tree.
251 	 */
252 	RB_SET_FATHER(self, parent);
253 	RB_SET_POSITION(self, position);
254 	if (__predict_false(parent == (struct rb_node *)(void *)&rbt->rbt_root)) {
255 		RB_MARK_BLACK(self);		/* root is always black */
256 #ifndef RBSMALL
257 		rbt->rbt_minmax[RB_DIR_LEFT] = self;
258 		rbt->rbt_minmax[RB_DIR_RIGHT] = self;
259 #endif
260 		rebalance = false;
261 	} else {
262 		KASSERT(position == RB_DIR_LEFT || position == RB_DIR_RIGHT);
263 #ifndef RBSMALL
264 		/*
265 		 * Keep track of the minimum and maximum nodes.  If our
266 		 * parent is a minmax node and we on their min/max side,
267 		 * we must be the new min/max node.
268 		 */
269 		if (parent == rbt->rbt_minmax[position])
270 			rbt->rbt_minmax[position] = self;
271 #endif /* !RBSMALL */
272 		/*
273 		 * All new nodes are colored red.  We only need to rebalance
274 		 * if our parent is also red.
275 		 */
276 		RB_MARK_RED(self);
277 		rebalance = RB_RED_P(parent);
278 	}
279 	KASSERT(RB_SENTINEL_P(parent->rb_nodes[position]));
280 	self->rb_left = parent->rb_nodes[position];
281 	self->rb_right = parent->rb_nodes[position];
282 	parent->rb_nodes[position] = self;
283 	KASSERT(RB_CHILDLESS_P(self));
284 
285 	/*
286 	 * Insert the new node into a sorted list for easy sequential access
287 	 */
288 	RBSTAT_INC(rbt->rbt_count);
289 #ifdef RBDEBUG
290 	if (RB_ROOT_P(rbt, self)) {
291 		RB_TAILQ_INSERT_HEAD(&rbt->rbt_nodes, self, rb_link);
292 	} else if (position == RB_DIR_LEFT) {
293 		KASSERT((*compare_nodes)(rbto->rbto_context,
294 		    RB_NODETOITEM(rbto, self),
295 		    RB_NODETOITEM(rbto, RB_FATHER(self))) < 0);
296 		RB_TAILQ_INSERT_BEFORE(RB_FATHER(self), self, rb_link);
297 	} else {
298 		KASSERT((*compare_nodes)(rbto->rbto_context,
299 		    RB_NODETOITEM(rbto, RB_FATHER(self)),
300 		    RB_NODETOITEM(rbto, self)) < 0);
301 		RB_TAILQ_INSERT_AFTER(&rbt->rbt_nodes, RB_FATHER(self),
302 		    self, rb_link);
303 	}
304 #endif
305 	KASSERT(rb_tree_check_node(rbt, self, NULL, !rebalance));
306 
307 	/*
308 	 * Rebalance tree after insertion
309 	 */
310 	if (rebalance) {
311 		rb_tree_insert_rebalance(rbt, self);
312 		KASSERT(rb_tree_check_node(rbt, self, NULL, true));
313 	}
314 
315 	/* Succesfully inserted, return our node pointer. */
316 	return object;
317 }
318 
319 /*
320  * Swap the location and colors of 'self' and its child @ which.  The child
321  * can not be a sentinel node.  This is our rotation function.  However,
322  * since it preserves coloring, it great simplifies both insertion and
323  * removal since rotation almost always involves the exchanging of colors
324  * as a separate step.
325  */
326 static void
327 rb_tree_reparent_nodes(__rbt_unused struct rb_tree *rbt,
328 	struct rb_node *old_father, const unsigned int which)
329 {
330 	const unsigned int other = which ^ RB_DIR_OTHER;
331 	struct rb_node * const grandpa = RB_FATHER(old_father);
332 	struct rb_node * const old_child = old_father->rb_nodes[which];
333 	struct rb_node * const new_father = old_child;
334 	struct rb_node * const new_child = old_father;
335 
336 	KASSERT(which == RB_DIR_LEFT || which == RB_DIR_RIGHT);
337 
338 	KASSERT(!RB_SENTINEL_P(old_child));
339 	KASSERT(RB_FATHER(old_child) == old_father);
340 
341 	KASSERT(rb_tree_check_node(rbt, old_father, NULL, false));
342 	KASSERT(rb_tree_check_node(rbt, old_child, NULL, false));
343 	KASSERT(RB_ROOT_P(rbt, old_father) ||
344 	    rb_tree_check_node(rbt, grandpa, NULL, false));
345 
346 	/*
347 	 * Exchange descendant linkages.
348 	 */
349 	grandpa->rb_nodes[RB_POSITION(old_father)] = new_father;
350 	new_child->rb_nodes[which] = old_child->rb_nodes[other];
351 	new_father->rb_nodes[other] = new_child;
352 
353 	/*
354 	 * Update ancestor linkages
355 	 */
356 	RB_SET_FATHER(new_father, grandpa);
357 	RB_SET_FATHER(new_child, new_father);
358 
359 	/*
360 	 * Exchange properties between new_father and new_child.  The only
361 	 * change is that new_child's position is now on the other side.
362 	 */
363 #if 0
364 	{
365 		struct rb_node tmp;
366 		tmp.rb_info = 0;
367 		RB_COPY_PROPERTIES(&tmp, old_child);
368 		RB_COPY_PROPERTIES(new_father, old_father);
369 		RB_COPY_PROPERTIES(new_child, &tmp);
370 	}
371 #else
372 	RB_SWAP_PROPERTIES(new_father, new_child);
373 #endif
374 	RB_SET_POSITION(new_child, other);
375 
376 	/*
377 	 * Make sure to reparent the new child to ourself.
378 	 */
379 	if (!RB_SENTINEL_P(new_child->rb_nodes[which])) {
380 		RB_SET_FATHER(new_child->rb_nodes[which], new_child);
381 		RB_SET_POSITION(new_child->rb_nodes[which], which);
382 	}
383 
384 	KASSERT(rb_tree_check_node(rbt, new_father, NULL, false));
385 	KASSERT(rb_tree_check_node(rbt, new_child, NULL, false));
386 	KASSERT(RB_ROOT_P(rbt, new_father) ||
387 	    rb_tree_check_node(rbt, grandpa, NULL, false));
388 }
389 
390 static void
391 rb_tree_insert_rebalance(struct rb_tree *rbt, struct rb_node *self)
392 {
393 	struct rb_node * father = RB_FATHER(self);
394 	struct rb_node * grandpa = RB_FATHER(father);
395 	struct rb_node * uncle;
396 	unsigned int which;
397 	unsigned int other;
398 
399 	KASSERT(!RB_ROOT_P(rbt, self));
400 	KASSERT(RB_RED_P(self));
401 	KASSERT(RB_RED_P(father));
402 	RBSTAT_INC(rbt->rbt_insertion_rebalance_calls);
403 
404 	for (;;) {
405 		KASSERT(!RB_SENTINEL_P(self));
406 
407 		KASSERT(RB_RED_P(self));
408 		KASSERT(RB_RED_P(father));
409 		/*
410 		 * We are red and our parent is red, therefore we must have a
411 		 * grandfather and he must be black.
412 		 */
413 		grandpa = RB_FATHER(father);
414 		KASSERT(RB_BLACK_P(grandpa));
415 		KASSERT(RB_DIR_RIGHT == 1 && RB_DIR_LEFT == 0);
416 		which = (father == grandpa->rb_right);
417 		other = which ^ RB_DIR_OTHER;
418 		uncle = grandpa->rb_nodes[other];
419 
420 		if (RB_BLACK_P(uncle))
421 			break;
422 
423 		RBSTAT_INC(rbt->rbt_insertion_rebalance_passes);
424 		/*
425 		 * Case 1: our uncle is red
426 		 *   Simply invert the colors of our parent and
427 		 *   uncle and make our grandparent red.  And
428 		 *   then solve the problem up at his level.
429 		 */
430 		RB_MARK_BLACK(uncle);
431 		RB_MARK_BLACK(father);
432 		if (__predict_false(RB_ROOT_P(rbt, grandpa))) {
433 			/*
434 			 * If our grandpa is root, don't bother
435 			 * setting him to red, just return.
436 			 */
437 			KASSERT(RB_BLACK_P(grandpa));
438 			return;
439 		}
440 		RB_MARK_RED(grandpa);
441 		self = grandpa;
442 		father = RB_FATHER(self);
443 		KASSERT(RB_RED_P(self));
444 		if (RB_BLACK_P(father)) {
445 			/*
446 			 * If our greatgrandpa is black, we're done.
447 			 */
448 			KASSERT(RB_BLACK_P(rbt->rbt_root));
449 			return;
450 		}
451 	}
452 
453 	KASSERT(!RB_ROOT_P(rbt, self));
454 	KASSERT(RB_RED_P(self));
455 	KASSERT(RB_RED_P(father));
456 	KASSERT(RB_BLACK_P(uncle));
457 	KASSERT(RB_BLACK_P(grandpa));
458 	/*
459 	 * Case 2&3: our uncle is black.
460 	 */
461 	if (self == father->rb_nodes[other]) {
462 		/*
463 		 * Case 2: we are on the same side as our uncle
464 		 *   Swap ourselves with our parent so this case
465 		 *   becomes case 3.  Basically our parent becomes our
466 		 *   child.
467 		 */
468 		rb_tree_reparent_nodes(rbt, father, other);
469 		KASSERT(RB_FATHER(father) == self);
470 		KASSERT(self->rb_nodes[which] == father);
471 		KASSERT(RB_FATHER(self) == grandpa);
472 		self = father;
473 		father = RB_FATHER(self);
474 	}
475 	KASSERT(RB_RED_P(self) && RB_RED_P(father));
476 	KASSERT(grandpa->rb_nodes[which] == father);
477 	/*
478 	 * Case 3: we are opposite a child of a black uncle.
479 	 *   Swap our parent and grandparent.  Since our grandfather
480 	 *   is black, our father will become black and our new sibling
481 	 *   (former grandparent) will become red.
482 	 */
483 	rb_tree_reparent_nodes(rbt, grandpa, which);
484 	KASSERT(RB_FATHER(self) == father);
485 	KASSERT(RB_FATHER(self)->rb_nodes[RB_POSITION(self) ^ RB_DIR_OTHER] == grandpa);
486 	KASSERT(RB_RED_P(self));
487 	KASSERT(RB_BLACK_P(father));
488 	KASSERT(RB_RED_P(grandpa));
489 
490 	/*
491 	 * Final step: Set the root to black.
492 	 */
493 	RB_MARK_BLACK(rbt->rbt_root);
494 }
495 
496 static void
497 rb_tree_prune_node(struct rb_tree *rbt, struct rb_node *self, bool rebalance)
498 {
499 	const unsigned int which = RB_POSITION(self);
500 	struct rb_node *father = RB_FATHER(self);
501 #ifndef RBSMALL
502 	const bool was_root = RB_ROOT_P(rbt, self);
503 #endif
504 
505 	KASSERT(rebalance || (RB_ROOT_P(rbt, self) || RB_RED_P(self)));
506 	KASSERT(!rebalance || RB_BLACK_P(self));
507 	KASSERT(RB_CHILDLESS_P(self));
508 	KASSERT(rb_tree_check_node(rbt, self, NULL, false));
509 
510 	/*
511 	 * Since we are childless, we know that self->rb_left is pointing
512 	 * to the sentinel node.
513 	 */
514 	father->rb_nodes[which] = self->rb_left;
515 
516 	/*
517 	 * Remove ourselves from the node list, decrement the count,
518 	 * and update min/max.
519 	 */
520 	RB_TAILQ_REMOVE(&rbt->rbt_nodes, self, rb_link);
521 	RBSTAT_DEC(rbt->rbt_count);
522 #ifndef RBSMALL
523 	if (__predict_false(rbt->rbt_minmax[RB_POSITION(self)] == self)) {
524 		rbt->rbt_minmax[RB_POSITION(self)] = father;
525 		/*
526 		 * When removing the root, rbt->rbt_minmax[RB_DIR_LEFT] is
527 		 * updated automatically, but we also need to update
528 		 * rbt->rbt_minmax[RB_DIR_RIGHT];
529 		 */
530 		if (__predict_false(was_root)) {
531 			rbt->rbt_minmax[RB_DIR_RIGHT] = father;
532 		}
533 	}
534 	RB_SET_FATHER(self, NULL);
535 #endif
536 
537 	/*
538 	 * Rebalance if requested.
539 	 */
540 	if (rebalance)
541 		rb_tree_removal_rebalance(rbt, father, which);
542 	KASSERT(was_root || rb_tree_check_node(rbt, father, NULL, true));
543 }
544 
545 /*
546  * When deleting an interior node
547  */
548 static void
549 rb_tree_swap_prune_and_rebalance(struct rb_tree *rbt, struct rb_node *self,
550 	struct rb_node *standin)
551 {
552 	const unsigned int standin_which = RB_POSITION(standin);
553 	unsigned int standin_other = standin_which ^ RB_DIR_OTHER;
554 	struct rb_node *standin_son;
555 	struct rb_node *standin_father = RB_FATHER(standin);
556 	bool rebalance = RB_BLACK_P(standin);
557 
558 	if (standin_father == self) {
559 		/*
560 		 * As a child of self, any childen would be opposite of
561 		 * our parent.
562 		 */
563 		KASSERT(RB_SENTINEL_P(standin->rb_nodes[standin_other]));
564 		standin_son = standin->rb_nodes[standin_which];
565 	} else {
566 		/*
567 		 * Since we aren't a child of self, any childen would be
568 		 * on the same side as our parent.
569 		 */
570 		KASSERT(RB_SENTINEL_P(standin->rb_nodes[standin_which]));
571 		standin_son = standin->rb_nodes[standin_other];
572 	}
573 
574 	/*
575 	 * the node we are removing must have two children.
576 	 */
577 	KASSERT(RB_TWOCHILDREN_P(self));
578 	/*
579 	 * If standin has a child, it must be red.
580 	 */
581 	KASSERT(RB_SENTINEL_P(standin_son) || RB_RED_P(standin_son));
582 
583 	/*
584 	 * Verify things are sane.
585 	 */
586 	KASSERT(rb_tree_check_node(rbt, self, NULL, false));
587 	KASSERT(rb_tree_check_node(rbt, standin, NULL, false));
588 
589 	if (__predict_false(RB_RED_P(standin_son))) {
590 		/*
591 		 * We know we have a red child so if we flip it to black
592 		 * we don't have to rebalance.
593 		 */
594 		KASSERT(rb_tree_check_node(rbt, standin_son, NULL, true));
595 		RB_MARK_BLACK(standin_son);
596 		rebalance = false;
597 
598 		if (standin_father == self) {
599 			KASSERT(RB_POSITION(standin_son) == standin_which);
600 		} else {
601 			KASSERT(RB_POSITION(standin_son) == standin_other);
602 			/*
603 			 * Change the son's parentage to point to his grandpa.
604 			 */
605 			RB_SET_FATHER(standin_son, standin_father);
606 			RB_SET_POSITION(standin_son, standin_which);
607 		}
608 	}
609 
610 	if (standin_father == self) {
611 		/*
612 		 * If we are about to delete the standin's father, then when
613 		 * we call rebalance, we need to use ourselves as our father.
614 		 * Otherwise remember our original father.  Also, sincef we are
615 		 * our standin's father we only need to reparent the standin's
616 		 * brother.
617 		 *
618 		 * |    R      -->     S    |
619 		 * |  Q   S    -->   Q   T  |
620 		 * |        t  -->          |
621 		 */
622 		KASSERT(RB_SENTINEL_P(standin->rb_nodes[standin_other]));
623 		KASSERT(!RB_SENTINEL_P(self->rb_nodes[standin_other]));
624 		KASSERT(self->rb_nodes[standin_which] == standin);
625 		/*
626 		 * Have our son/standin adopt his brother as his new son.
627 		 */
628 		standin_father = standin;
629 	} else {
630 		/*
631 		 * |    R          -->    S       .  |
632 		 * |   / \  |   T  -->   / \  |  /   |
633 		 * |  ..... | S    -->  ..... | T    |
634 		 *
635 		 * Sever standin's connection to his father.
636 		 */
637 		standin_father->rb_nodes[standin_which] = standin_son;
638 		/*
639 		 * Adopt the far son.
640 		 */
641 		standin->rb_nodes[standin_other] = self->rb_nodes[standin_other];
642 		RB_SET_FATHER(standin->rb_nodes[standin_other], standin);
643 		KASSERT(RB_POSITION(self->rb_nodes[standin_other]) == standin_other);
644 		/*
645 		 * Use standin_other because we need to preserve standin_which
646 		 * for the removal_rebalance.
647 		 */
648 		standin_other = standin_which;
649 	}
650 
651 	/*
652 	 * Move the only remaining son to our standin.  If our standin is our
653 	 * son, this will be the only son needed to be moved.
654 	 */
655 	KASSERT(standin->rb_nodes[standin_other] != self->rb_nodes[standin_other]);
656 	standin->rb_nodes[standin_other] = self->rb_nodes[standin_other];
657 	RB_SET_FATHER(standin->rb_nodes[standin_other], standin);
658 
659 	/*
660 	 * Now copy the result of self to standin and then replace
661 	 * self with standin in the tree.
662 	 */
663 	RB_COPY_PROPERTIES(standin, self);
664 	RB_SET_FATHER(standin, RB_FATHER(self));
665 	RB_FATHER(standin)->rb_nodes[RB_POSITION(standin)] = standin;
666 
667 	/*
668 	 * Remove ourselves from the node list, decrement the count,
669 	 * and update min/max.
670 	 */
671 	RB_TAILQ_REMOVE(&rbt->rbt_nodes, self, rb_link);
672 	RBSTAT_DEC(rbt->rbt_count);
673 #ifndef RBSMALL
674 	if (__predict_false(rbt->rbt_minmax[RB_POSITION(self)] == self))
675 		rbt->rbt_minmax[RB_POSITION(self)] = RB_FATHER(self);
676 	RB_SET_FATHER(self, NULL);
677 #endif
678 
679 	KASSERT(rb_tree_check_node(rbt, standin, NULL, false));
680 	KASSERT(RB_FATHER_SENTINEL_P(standin)
681 		|| rb_tree_check_node(rbt, standin_father, NULL, false));
682 	KASSERT(RB_LEFT_SENTINEL_P(standin)
683 		|| rb_tree_check_node(rbt, standin->rb_left, NULL, false));
684 	KASSERT(RB_RIGHT_SENTINEL_P(standin)
685 		|| rb_tree_check_node(rbt, standin->rb_right, NULL, false));
686 
687 	if (!rebalance)
688 		return;
689 
690 	rb_tree_removal_rebalance(rbt, standin_father, standin_which);
691 	KASSERT(rb_tree_check_node(rbt, standin, NULL, true));
692 }
693 
694 /*
695  * We could do this by doing
696  *	rb_tree_node_swap(rbt, self, which);
697  *	rb_tree_prune_node(rbt, self, false);
698  *
699  * But it's more efficient to just evalate and recolor the child.
700  */
701 static void
702 rb_tree_prune_blackred_branch(struct rb_tree *rbt, struct rb_node *self,
703 	unsigned int which)
704 {
705 	struct rb_node *father = RB_FATHER(self);
706 	struct rb_node *son = self->rb_nodes[which];
707 #ifndef RBSMALL
708 	const bool was_root = RB_ROOT_P(rbt, self);
709 #endif
710 
711 	KASSERT(which == RB_DIR_LEFT || which == RB_DIR_RIGHT);
712 	KASSERT(RB_BLACK_P(self) && RB_RED_P(son));
713 	KASSERT(!RB_TWOCHILDREN_P(son));
714 	KASSERT(RB_CHILDLESS_P(son));
715 	KASSERT(rb_tree_check_node(rbt, self, NULL, false));
716 	KASSERT(rb_tree_check_node(rbt, son, NULL, false));
717 
718 	/*
719 	 * Remove ourselves from the tree and give our former child our
720 	 * properties (position, color, root).
721 	 */
722 	RB_COPY_PROPERTIES(son, self);
723 	father->rb_nodes[RB_POSITION(son)] = son;
724 	RB_SET_FATHER(son, father);
725 
726 	/*
727 	 * Remove ourselves from the node list, decrement the count,
728 	 * and update minmax.
729 	 */
730 	RB_TAILQ_REMOVE(&rbt->rbt_nodes, self, rb_link);
731 	RBSTAT_DEC(rbt->rbt_count);
732 #ifndef RBSMALL
733 	if (__predict_false(was_root)) {
734 		KASSERT(rbt->rbt_minmax[which] == son);
735 		rbt->rbt_minmax[which ^ RB_DIR_OTHER] = son;
736 	} else if (rbt->rbt_minmax[RB_POSITION(self)] == self) {
737 		rbt->rbt_minmax[RB_POSITION(self)] = son;
738 	}
739 	RB_SET_FATHER(self, NULL);
740 #endif
741 
742 	KASSERT(was_root || rb_tree_check_node(rbt, father, NULL, true));
743 	KASSERT(rb_tree_check_node(rbt, son, NULL, true));
744 }
745 
746 void
747 rb_tree_remove_node(struct rb_tree *rbt, void *object)
748 {
749 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
750 	struct rb_node *standin, *self = RB_ITEMTONODE(rbto, object);
751 	unsigned int which;
752 
753 	KASSERT(!RB_SENTINEL_P(self));
754 	RBSTAT_INC(rbt->rbt_removals);
755 
756 	/*
757 	 * In the following diagrams, we (the node to be removed) are S.  Red
758 	 * nodes are lowercase.  T could be either red or black.
759 	 *
760 	 * Remember the major axiom of the red-black tree: the number of
761 	 * black nodes from the root to each leaf is constant across all
762 	 * leaves, only the number of red nodes varies.
763 	 *
764 	 * Thus removing a red leaf doesn't require any other changes to a
765 	 * red-black tree.  So if we must remove a node, attempt to rearrange
766 	 * the tree so we can remove a red node.
767 	 *
768 	 * The simpliest case is a childless red node or a childless root node:
769 	 *
770 	 * |    T  -->    T  |    or    |  R  -->  *  |
771 	 * |  s    -->  *    |
772 	 */
773 	if (RB_CHILDLESS_P(self)) {
774 		const bool rebalance = RB_BLACK_P(self) && !RB_ROOT_P(rbt, self);
775 		rb_tree_prune_node(rbt, self, rebalance);
776 		return;
777 	}
778 	KASSERT(!RB_CHILDLESS_P(self));
779 	if (!RB_TWOCHILDREN_P(self)) {
780 		/*
781 		 * The next simpliest case is the node we are deleting is
782 		 * black and has one red child.
783 		 *
784 		 * |      T  -->      T  -->      T  |
785 		 * |    S    -->  R      -->  R      |
786 		 * |  r      -->    s    -->    *    |
787 		 */
788 		which = RB_LEFT_SENTINEL_P(self) ? RB_DIR_RIGHT : RB_DIR_LEFT;
789 		KASSERT(RB_BLACK_P(self));
790 		KASSERT(RB_RED_P(self->rb_nodes[which]));
791 		KASSERT(RB_CHILDLESS_P(self->rb_nodes[which]));
792 		rb_tree_prune_blackred_branch(rbt, self, which);
793 		return;
794 	}
795 	KASSERT(RB_TWOCHILDREN_P(self));
796 
797 	/*
798 	 * We invert these because we prefer to remove from the inside of
799 	 * the tree.
800 	 */
801 	which = RB_POSITION(self) ^ RB_DIR_OTHER;
802 
803 	/*
804 	 * Let's find the node closes to us opposite of our parent
805 	 * Now swap it with ourself, "prune" it, and rebalance, if needed.
806 	 */
807 	standin = RB_ITEMTONODE(rbto, rb_tree_iterate(rbt, object, which));
808 	rb_tree_swap_prune_and_rebalance(rbt, self, standin);
809 }
810 
811 static void
812 rb_tree_removal_rebalance(struct rb_tree *rbt, struct rb_node *parent,
813 	unsigned int which)
814 {
815 	KASSERT(!RB_SENTINEL_P(parent));
816 	KASSERT(RB_SENTINEL_P(parent->rb_nodes[which]));
817 	KASSERT(which == RB_DIR_LEFT || which == RB_DIR_RIGHT);
818 	RBSTAT_INC(rbt->rbt_removal_rebalance_calls);
819 
820 	while (RB_BLACK_P(parent->rb_nodes[which])) {
821 		unsigned int other = which ^ RB_DIR_OTHER;
822 		struct rb_node *brother = parent->rb_nodes[other];
823 
824 		RBSTAT_INC(rbt->rbt_removal_rebalance_passes);
825 
826 		KASSERT(!RB_SENTINEL_P(brother));
827 		/*
828 		 * For cases 1, 2a, and 2b, our brother's children must
829 		 * be black and our father must be black
830 		 */
831 		if (RB_BLACK_P(parent)
832 		    && RB_BLACK_P(brother->rb_left)
833 		    && RB_BLACK_P(brother->rb_right)) {
834 			if (RB_RED_P(brother)) {
835 				/*
836 				 * Case 1: Our brother is red, swap its
837 				 * position (and colors) with our parent.
838 				 * This should now be case 2b (unless C or E
839 				 * has a red child which is case 3; thus no
840 				 * explicit branch to case 2b).
841 				 *
842 				 *    B         ->        D
843 				 *  A     d     ->    b     E
844 				 *      C   E   ->  A   C
845 				 */
846 				KASSERT(RB_BLACK_P(parent));
847 				rb_tree_reparent_nodes(rbt, parent, other);
848 				brother = parent->rb_nodes[other];
849 				KASSERT(!RB_SENTINEL_P(brother));
850 				KASSERT(RB_RED_P(parent));
851 				KASSERT(RB_BLACK_P(brother));
852 				KASSERT(rb_tree_check_node(rbt, brother, NULL, false));
853 				KASSERT(rb_tree_check_node(rbt, parent, NULL, false));
854 			} else {
855 				/*
856 				 * Both our parent and brother are black.
857 				 * Change our brother to red, advance up rank
858 				 * and go through the loop again.
859 				 *
860 				 *    B         ->   *B
861 				 * *A     D     ->  A     d
862 				 *      C   E   ->      C   E
863 				 */
864 				RB_MARK_RED(brother);
865 				KASSERT(RB_BLACK_P(brother->rb_left));
866 				KASSERT(RB_BLACK_P(brother->rb_right));
867 				if (RB_ROOT_P(rbt, parent))
868 					return;	/* root == parent == black */
869 				KASSERT(rb_tree_check_node(rbt, brother, NULL, false));
870 				KASSERT(rb_tree_check_node(rbt, parent, NULL, false));
871 				which = RB_POSITION(parent);
872 				parent = RB_FATHER(parent);
873 				continue;
874 			}
875 		}
876 		/*
877 		 * Avoid an else here so that case 2a above can hit either
878 		 * case 2b, 3, or 4.
879 		 */
880 		if (RB_RED_P(parent)
881 		    && RB_BLACK_P(brother)
882 		    && RB_BLACK_P(brother->rb_left)
883 		    && RB_BLACK_P(brother->rb_right)) {
884 			KASSERT(RB_RED_P(parent));
885 			KASSERT(RB_BLACK_P(brother));
886 			KASSERT(RB_BLACK_P(brother->rb_left));
887 			KASSERT(RB_BLACK_P(brother->rb_right));
888 			/*
889 			 * We are black, our father is red, our brother and
890 			 * both nephews are black.  Simply invert/exchange the
891 			 * colors of our father and brother (to black and red
892 			 * respectively).
893 			 *
894 			 *	|    f        -->    F        |
895 			 *	|  *     B    -->  *     b    |
896 			 *	|      N   N  -->      N   N  |
897 			 */
898 			RB_MARK_BLACK(parent);
899 			RB_MARK_RED(brother);
900 			KASSERT(rb_tree_check_node(rbt, brother, NULL, true));
901 			break;		/* We're done! */
902 		} else {
903 			/*
904 			 * Our brother must be black and have at least one
905 			 * red child (it may have two).
906 			 */
907 			KASSERT(RB_BLACK_P(brother));
908 			KASSERT(RB_RED_P(brother->rb_nodes[which]) ||
909 				RB_RED_P(brother->rb_nodes[other]));
910 			if (RB_BLACK_P(brother->rb_nodes[other])) {
911 				/*
912 				 * Case 3: our brother is black, our near
913 				 * nephew is red, and our far nephew is black.
914 				 * Swap our brother with our near nephew.
915 				 * This result in a tree that matches case 4.
916 				 * (Our father could be red or black).
917 				 *
918 				 *	|    F      -->    F      |
919 				 *	|  x     B  -->  x   B    |
920 				 *	|      n    -->        n  |
921 				 */
922 				KASSERT(RB_RED_P(brother->rb_nodes[which]));
923 				rb_tree_reparent_nodes(rbt, brother, which);
924 				KASSERT(RB_FATHER(brother) == parent->rb_nodes[other]);
925 				brother = parent->rb_nodes[other];
926 				KASSERT(RB_RED_P(brother->rb_nodes[other]));
927 			}
928 			/*
929 			 * Case 4: our brother is black and our far nephew
930 			 * is red.  Swap our father and brother locations and
931 			 * change our far nephew to black.  (these can be
932 			 * done in either order so we change the color first).
933 			 * The result is a valid red-black tree and is a
934 			 * terminal case.  (again we don't care about the
935 			 * father's color)
936 			 *
937 			 * If the father is red, we will get a red-black-black
938 			 * tree:
939 			 *	|  f      ->  f      -->    b    |
940 			 *	|    B    ->    B    -->  F   N  |
941 			 *	|      n  ->      N  -->         |
942 			 *
943 			 * If the father is black, we will get an all black
944 			 * tree:
945 			 *	|  F      ->  F      -->    B    |
946 			 *	|    B    ->    B    -->  F   N  |
947 			 *	|      n  ->      N  -->         |
948 			 *
949 			 * If we had two red nephews, then after the swap,
950 			 * our former father would have a red grandson.
951 			 */
952 			KASSERT(RB_BLACK_P(brother));
953 			KASSERT(RB_RED_P(brother->rb_nodes[other]));
954 			RB_MARK_BLACK(brother->rb_nodes[other]);
955 			rb_tree_reparent_nodes(rbt, parent, other);
956 			break;		/* We're done! */
957 		}
958 	}
959 	KASSERT(rb_tree_check_node(rbt, parent, NULL, true));
960 }
961 
962 void *
963 rb_tree_iterate(struct rb_tree *rbt, void *object, const unsigned int direction)
964 {
965 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
966 	const unsigned int other = direction ^ RB_DIR_OTHER;
967 	struct rb_node *self;
968 
969 	KASSERT(direction == RB_DIR_LEFT || direction == RB_DIR_RIGHT);
970 
971 	if (object == NULL) {
972 #ifndef RBSMALL
973 		if (RB_SENTINEL_P(rbt->rbt_root))
974 			return NULL;
975 		return RB_NODETOITEM(rbto, rbt->rbt_minmax[direction]);
976 #else
977 		self = rbt->rbt_root;
978 		if (RB_SENTINEL_P(self))
979 			return NULL;
980 		while (!RB_SENTINEL_P(self->rb_nodes[direction]))
981 			self = self->rb_nodes[direction];
982 		return RB_NODETOITEM(rbto, self);
983 #endif /* !RBSMALL */
984 	}
985 	self = RB_ITEMTONODE(rbto, object);
986 	KASSERT(!RB_SENTINEL_P(self));
987 	/*
988 	 * We can't go any further in this direction.  We proceed up in the
989 	 * opposite direction until our parent is in direction we want to go.
990 	 */
991 	if (RB_SENTINEL_P(self->rb_nodes[direction])) {
992 		while (!RB_ROOT_P(rbt, self)) {
993 			if (other == RB_POSITION(self))
994 				return RB_NODETOITEM(rbto, RB_FATHER(self));
995 			self = RB_FATHER(self);
996 		}
997 		return NULL;
998 	}
999 
1000 	/*
1001 	 * Advance down one in current direction and go down as far as possible
1002 	 * in the opposite direction.
1003 	 */
1004 	self = self->rb_nodes[direction];
1005 	KASSERT(!RB_SENTINEL_P(self));
1006 	while (!RB_SENTINEL_P(self->rb_nodes[other]))
1007 		self = self->rb_nodes[other];
1008 	return RB_NODETOITEM(rbto, self);
1009 }
1010 
1011 #ifdef RBDEBUG
1012 static const struct rb_node *
1013 rb_tree_iterate_const(const struct rb_tree *rbt, const struct rb_node *self,
1014 	const unsigned int direction)
1015 {
1016 	const unsigned int other = direction ^ RB_DIR_OTHER;
1017 	KASSERT(direction == RB_DIR_LEFT || direction == RB_DIR_RIGHT);
1018 
1019 	if (self == NULL) {
1020 #ifndef RBSMALL
1021 		if (RB_SENTINEL_P(rbt->rbt_root))
1022 			return NULL;
1023 		return rbt->rbt_minmax[direction];
1024 #else
1025 		self = rbt->rbt_root;
1026 		if (RB_SENTINEL_P(self))
1027 			return NULL;
1028 		while (!RB_SENTINEL_P(self->rb_nodes[direction]))
1029 			self = self->rb_nodes[direction];
1030 		return self;
1031 #endif /* !RBSMALL */
1032 	}
1033 	KASSERT(!RB_SENTINEL_P(self));
1034 	/*
1035 	 * We can't go any further in this direction.  We proceed up in the
1036 	 * opposite direction until our parent is in direction we want to go.
1037 	 */
1038 	if (RB_SENTINEL_P(self->rb_nodes[direction])) {
1039 		while (!RB_ROOT_P(rbt, self)) {
1040 			if (other == RB_POSITION(self))
1041 				return RB_FATHER(self);
1042 			self = RB_FATHER(self);
1043 		}
1044 		return NULL;
1045 	}
1046 
1047 	/*
1048 	 * Advance down one in current direction and go down as far as possible
1049 	 * in the opposite direction.
1050 	 */
1051 	self = self->rb_nodes[direction];
1052 	KASSERT(!RB_SENTINEL_P(self));
1053 	while (!RB_SENTINEL_P(self->rb_nodes[other]))
1054 		self = self->rb_nodes[other];
1055 	return self;
1056 }
1057 
1058 static unsigned int
1059 rb_tree_count_black(const struct rb_node *self)
1060 {
1061 	unsigned int left, right;
1062 
1063 	if (RB_SENTINEL_P(self))
1064 		return 0;
1065 
1066 	left = rb_tree_count_black(self->rb_left);
1067 	right = rb_tree_count_black(self->rb_right);
1068 
1069 	KASSERT(left == right);
1070 
1071 	return left + RB_BLACK_P(self);
1072 }
1073 
1074 static bool
1075 rb_tree_check_node(const struct rb_tree *rbt, const struct rb_node *self,
1076 	const struct rb_node *prev, bool red_check)
1077 {
1078 	const rb_tree_ops_t *rbto = rbt->rbt_ops;
1079 	rbto_compare_nodes_fn compare_nodes = rbto->rbto_compare_nodes;
1080 
1081 	KASSERT(!RB_SENTINEL_P(self));
1082 	KASSERT(prev == NULL || (*compare_nodes)(rbto->rbto_context,
1083 	    RB_NODETOITEM(rbto, prev), RB_NODETOITEM(rbto, self)) < 0);
1084 
1085 	/*
1086 	 * Verify our relationship to our parent.
1087 	 */
1088 	if (RB_ROOT_P(rbt, self)) {
1089 		KASSERT(self == rbt->rbt_root);
1090 		KASSERT(RB_POSITION(self) == RB_DIR_LEFT);
1091 		KASSERT(RB_FATHER(self)->rb_nodes[RB_DIR_LEFT] == self);
1092 		KASSERT(RB_FATHER(self) == (const struct rb_node *) &rbt->rbt_root);
1093 	} else {
1094 		int diff = (*compare_nodes)(rbto->rbto_context,
1095 		    RB_NODETOITEM(rbto, self),
1096 		    RB_NODETOITEM(rbto, RB_FATHER(self)));
1097 
1098 		KASSERT(self != rbt->rbt_root);
1099 		KASSERT(!RB_FATHER_SENTINEL_P(self));
1100 		if (RB_POSITION(self) == RB_DIR_LEFT) {
1101 			KASSERT(diff < 0);
1102 			KASSERT(RB_FATHER(self)->rb_nodes[RB_DIR_LEFT] == self);
1103 		} else {
1104 			KASSERT(diff > 0);
1105 			KASSERT(RB_FATHER(self)->rb_nodes[RB_DIR_RIGHT] == self);
1106 		}
1107 	}
1108 
1109 	/*
1110 	 * Verify our position in the linked list against the tree itself.
1111 	 */
1112 	{
1113 		const struct rb_node *prev0 = rb_tree_iterate_const(rbt, self, RB_DIR_LEFT);
1114 		const struct rb_node *next0 = rb_tree_iterate_const(rbt, self, RB_DIR_RIGHT);
1115 		KASSERT(prev0 == TAILQ_PREV(self, rb_node_qh, rb_link));
1116 		KASSERT(next0 == TAILQ_NEXT(self, rb_link));
1117 #ifndef RBSMALL
1118 		KASSERT(prev0 != NULL || self == rbt->rbt_minmax[RB_DIR_LEFT]);
1119 		KASSERT(next0 != NULL || self == rbt->rbt_minmax[RB_DIR_RIGHT]);
1120 #endif
1121 	}
1122 
1123 	/*
1124 	 * The root must be black.
1125 	 * There can never be two adjacent red nodes.
1126 	 */
1127 	if (red_check) {
1128 		KASSERT(!RB_ROOT_P(rbt, self) || RB_BLACK_P(self));
1129 		(void) rb_tree_count_black(self);
1130 		if (RB_RED_P(self)) {
1131 			const struct rb_node *brother;
1132 			KASSERT(!RB_ROOT_P(rbt, self));
1133 			brother = RB_FATHER(self)->rb_nodes[RB_POSITION(self) ^ RB_DIR_OTHER];
1134 			KASSERT(RB_BLACK_P(RB_FATHER(self)));
1135 			/*
1136 			 * I'm red and have no children, then I must either
1137 			 * have no brother or my brother also be red and
1138 			 * also have no children.  (black count == 0)
1139 			 */
1140 			KASSERT(!RB_CHILDLESS_P(self)
1141 				|| RB_SENTINEL_P(brother)
1142 				|| RB_RED_P(brother)
1143 				|| RB_CHILDLESS_P(brother));
1144 			/*
1145 			 * If I'm not childless, I must have two children
1146 			 * and they must be both be black.
1147 			 */
1148 			KASSERT(RB_CHILDLESS_P(self)
1149 				|| (RB_TWOCHILDREN_P(self)
1150 				    && RB_BLACK_P(self->rb_left)
1151 				    && RB_BLACK_P(self->rb_right)));
1152 			/*
1153 			 * If I'm not childless, thus I have black children,
1154 			 * then my brother must either be black or have two
1155 			 * black children.
1156 			 */
1157 			KASSERT(RB_CHILDLESS_P(self)
1158 				|| RB_BLACK_P(brother)
1159 				|| (RB_TWOCHILDREN_P(brother)
1160 				    && RB_BLACK_P(brother->rb_left)
1161 				    && RB_BLACK_P(brother->rb_right)));
1162 		} else {
1163 			/*
1164 			 * If I'm black and have one child, that child must
1165 			 * be red and childless.
1166 			 */
1167 			KASSERT(RB_CHILDLESS_P(self)
1168 				|| RB_TWOCHILDREN_P(self)
1169 				|| (!RB_LEFT_SENTINEL_P(self)
1170 				    && RB_RIGHT_SENTINEL_P(self)
1171 				    && RB_RED_P(self->rb_left)
1172 				    && RB_CHILDLESS_P(self->rb_left))
1173 				|| (!RB_RIGHT_SENTINEL_P(self)
1174 				    && RB_LEFT_SENTINEL_P(self)
1175 				    && RB_RED_P(self->rb_right)
1176 				    && RB_CHILDLESS_P(self->rb_right)));
1177 
1178 			/*
1179 			 * If I'm a childless black node and my parent is
1180 			 * black, my 2nd closet relative away from my parent
1181 			 * is either red or has a red parent or red children.
1182 			 */
1183 			if (!RB_ROOT_P(rbt, self)
1184 			    && RB_CHILDLESS_P(self)
1185 			    && RB_BLACK_P(RB_FATHER(self))) {
1186 				const unsigned int which = RB_POSITION(self);
1187 				const unsigned int other = which ^ RB_DIR_OTHER;
1188 				const struct rb_node *relative0, *relative;
1189 
1190 				relative0 = rb_tree_iterate_const(rbt,
1191 				    self, other);
1192 				KASSERT(relative0 != NULL);
1193 				relative = rb_tree_iterate_const(rbt,
1194 				    relative0, other);
1195 				KASSERT(relative != NULL);
1196 				KASSERT(RB_SENTINEL_P(relative->rb_nodes[which]));
1197 #if 0
1198 				KASSERT(RB_RED_P(relative)
1199 					|| RB_RED_P(relative->rb_left)
1200 					|| RB_RED_P(relative->rb_right)
1201 					|| RB_RED_P(RB_FATHER(relative)));
1202 #endif
1203 			}
1204 		}
1205 		/*
1206 		 * A grandparent's children must be real nodes and not
1207 		 * sentinels.  First check out grandparent.
1208 		 */
1209 		KASSERT(RB_ROOT_P(rbt, self)
1210 			|| RB_ROOT_P(rbt, RB_FATHER(self))
1211 			|| RB_TWOCHILDREN_P(RB_FATHER(RB_FATHER(self))));
1212 		/*
1213 		 * If we are have grandchildren on our left, then
1214 		 * we must have a child on our right.
1215 		 */
1216 		KASSERT(RB_LEFT_SENTINEL_P(self)
1217 			|| RB_CHILDLESS_P(self->rb_left)
1218 			|| !RB_RIGHT_SENTINEL_P(self));
1219 		/*
1220 		 * If we are have grandchildren on our right, then
1221 		 * we must have a child on our left.
1222 		 */
1223 		KASSERT(RB_RIGHT_SENTINEL_P(self)
1224 			|| RB_CHILDLESS_P(self->rb_right)
1225 			|| !RB_LEFT_SENTINEL_P(self));
1226 
1227 		/*
1228 		 * If we have a child on the left and it doesn't have two
1229 		 * children make sure we don't have great-great-grandchildren on
1230 		 * the right.
1231 		 */
1232 		KASSERT(RB_TWOCHILDREN_P(self->rb_left)
1233 			|| RB_CHILDLESS_P(self->rb_right)
1234 			|| RB_CHILDLESS_P(self->rb_right->rb_left)
1235 			|| RB_CHILDLESS_P(self->rb_right->rb_left->rb_left)
1236 			|| RB_CHILDLESS_P(self->rb_right->rb_left->rb_right)
1237 			|| RB_CHILDLESS_P(self->rb_right->rb_right)
1238 			|| RB_CHILDLESS_P(self->rb_right->rb_right->rb_left)
1239 			|| RB_CHILDLESS_P(self->rb_right->rb_right->rb_right));
1240 
1241 		/*
1242 		 * If we have a child on the right and it doesn't have two
1243 		 * children make sure we don't have great-great-grandchildren on
1244 		 * the left.
1245 		 */
1246 		KASSERT(RB_TWOCHILDREN_P(self->rb_right)
1247 			|| RB_CHILDLESS_P(self->rb_left)
1248 			|| RB_CHILDLESS_P(self->rb_left->rb_left)
1249 			|| RB_CHILDLESS_P(self->rb_left->rb_left->rb_left)
1250 			|| RB_CHILDLESS_P(self->rb_left->rb_left->rb_right)
1251 			|| RB_CHILDLESS_P(self->rb_left->rb_right)
1252 			|| RB_CHILDLESS_P(self->rb_left->rb_right->rb_left)
1253 			|| RB_CHILDLESS_P(self->rb_left->rb_right->rb_right));
1254 
1255 		/*
1256 		 * If we are fully interior node, then our predecessors and
1257 		 * successors must have no children in our direction.
1258 		 */
1259 		if (RB_TWOCHILDREN_P(self)) {
1260 			const struct rb_node *prev0;
1261 			const struct rb_node *next0;
1262 
1263 			prev0 = rb_tree_iterate_const(rbt, self, RB_DIR_LEFT);
1264 			KASSERT(prev0 != NULL);
1265 			KASSERT(RB_RIGHT_SENTINEL_P(prev0));
1266 
1267 			next0 = rb_tree_iterate_const(rbt, self, RB_DIR_RIGHT);
1268 			KASSERT(next0 != NULL);
1269 			KASSERT(RB_LEFT_SENTINEL_P(next0));
1270 		}
1271 	}
1272 
1273 	return true;
1274 }
1275 
1276 void
1277 rb_tree_check(const struct rb_tree *rbt, bool red_check)
1278 {
1279 	const struct rb_node *self;
1280 	const struct rb_node *prev;
1281 #ifdef RBSTATS
1282 	unsigned int count = 0;
1283 #endif
1284 
1285 	KASSERT(rbt->rbt_root != NULL);
1286 	KASSERT(RB_LEFT_P(rbt->rbt_root));
1287 
1288 #if defined(RBSTATS) && !defined(RBSMALL)
1289 	KASSERT(rbt->rbt_count > 1
1290 	    || rbt->rbt_minmax[RB_DIR_LEFT] == rbt->rbt_minmax[RB_DIR_RIGHT]);
1291 #endif
1292 
1293 	prev = NULL;
1294 	TAILQ_FOREACH(self, &rbt->rbt_nodes, rb_link) {
1295 		rb_tree_check_node(rbt, self, prev, false);
1296 #ifdef RBSTATS
1297 		count++;
1298 #endif
1299 	}
1300 #ifdef RBSTATS
1301 	KASSERT(rbt->rbt_count == count);
1302 #endif
1303 	if (red_check) {
1304 		KASSERT(RB_BLACK_P(rbt->rbt_root));
1305 		KASSERT(RB_SENTINEL_P(rbt->rbt_root)
1306 			|| rb_tree_count_black(rbt->rbt_root));
1307 
1308 		/*
1309 		 * The root must be black.
1310 		 * There can never be two adjacent red nodes.
1311 		 */
1312 		TAILQ_FOREACH(self, &rbt->rbt_nodes, rb_link) {
1313 			rb_tree_check_node(rbt, self, NULL, true);
1314 		}
1315 	}
1316 }
1317 #endif /* RBDEBUG */
1318 
1319 #ifdef RBSTATS
1320 static void
1321 rb_tree_mark_depth(const struct rb_tree *rbt, const struct rb_node *self,
1322 	size_t *depths, size_t depth)
1323 {
1324 	if (RB_SENTINEL_P(self))
1325 		return;
1326 
1327 	if (RB_TWOCHILDREN_P(self)) {
1328 		rb_tree_mark_depth(rbt, self->rb_left, depths, depth + 1);
1329 		rb_tree_mark_depth(rbt, self->rb_right, depths, depth + 1);
1330 		return;
1331 	}
1332 	depths[depth]++;
1333 	if (!RB_LEFT_SENTINEL_P(self)) {
1334 		rb_tree_mark_depth(rbt, self->rb_left, depths, depth + 1);
1335 	}
1336 	if (!RB_RIGHT_SENTINEL_P(self)) {
1337 		rb_tree_mark_depth(rbt, self->rb_right, depths, depth + 1);
1338 	}
1339 }
1340 
1341 void
1342 rb_tree_depths(const struct rb_tree *rbt, size_t *depths)
1343 {
1344 	rb_tree_mark_depth(rbt, rbt->rbt_root, depths, 1);
1345 }
1346 #endif /* RBSTATS */
1347