1e358b4fbSSasha Levin #include <kvm/rbtree-interval.h>
2e358b4fbSSasha Levin #include <stddef.h>
3495fbd4eSSasha Levin #include <errno.h>
4e358b4fbSSasha Levin
rb_int_search_single(struct rb_root * root,u64 point)5e358b4fbSSasha Levin struct rb_int_node *rb_int_search_single(struct rb_root *root, u64 point)
6e358b4fbSSasha Levin {
7e358b4fbSSasha Levin struct rb_node *node = root->rb_node;
8e358b4fbSSasha Levin
9e358b4fbSSasha Levin while (node) {
10e358b4fbSSasha Levin struct rb_int_node *cur = rb_int(node);
11e358b4fbSSasha Levin
12ffc83de3SMichel Lespinasse if (point < cur->low)
13e358b4fbSSasha Levin node = node->rb_left;
14ffc83de3SMichel Lespinasse else if (cur->high <= point)
15e358b4fbSSasha Levin node = node->rb_right;
16ffc83de3SMichel Lespinasse else
17ffc83de3SMichel Lespinasse return cur;
18e358b4fbSSasha Levin }
19e358b4fbSSasha Levin
20e358b4fbSSasha Levin return NULL;
21e358b4fbSSasha Levin }
22e358b4fbSSasha Levin
rb_int_search_range(struct rb_root * root,u64 low,u64 high)23e358b4fbSSasha Levin struct rb_int_node *rb_int_search_range(struct rb_root *root, u64 low, u64 high)
24e358b4fbSSasha Levin {
25e358b4fbSSasha Levin struct rb_int_node *range;
26e358b4fbSSasha Levin
27e358b4fbSSasha Levin range = rb_int_search_single(root, low);
28e358b4fbSSasha Levin if (range == NULL)
29e358b4fbSSasha Levin return NULL;
30e358b4fbSSasha Levin
31e358b4fbSSasha Levin /* We simply verify that 'high' is smaller than the end of the range where 'low' is located */
32e358b4fbSSasha Levin if (range->high < high)
33e358b4fbSSasha Levin return NULL;
34e358b4fbSSasha Levin
35e358b4fbSSasha Levin return range;
36e358b4fbSSasha Levin }
37e358b4fbSSasha Levin
rb_int_insert(struct rb_root * root,struct rb_int_node * i_node)38e358b4fbSSasha Levin int rb_int_insert(struct rb_root *root, struct rb_int_node *i_node)
39e358b4fbSSasha Levin {
4086824900SIngo Molnar struct rb_node **node = &root->rb_node, *parent = NULL;
41e358b4fbSSasha Levin
42e358b4fbSSasha Levin while (*node) {
433e64a4a4SMichel Lespinasse struct rb_int_node *cur = rb_int(*node);
44e358b4fbSSasha Levin
45e358b4fbSSasha Levin parent = *node;
463e64a4a4SMichel Lespinasse if (i_node->high <= cur->low)
473e64a4a4SMichel Lespinasse node = &cur->node.rb_left;
483e64a4a4SMichel Lespinasse else if (cur->high <= i_node->low)
493e64a4a4SMichel Lespinasse node = &cur->node.rb_right;
50e358b4fbSSasha Levin else
51495fbd4eSSasha Levin return -EEXIST;
52e358b4fbSSasha Levin }
53e358b4fbSSasha Levin
54e358b4fbSSasha Levin rb_link_node(&i_node->node, parent, node);
55*a83f8ed1SMichel Lespinasse rb_insert_color(&i_node->node, root);
56e358b4fbSSasha Levin
57495fbd4eSSasha Levin return 0;
58e358b4fbSSasha Levin }
59