4 #include <linux/types.h>
5 #include <linux/kernel.h>
6 #include <linux/bitops.h>
11 item_tag_set(struct radix_tree_root
*root
, unsigned long index
, int tag
)
13 return radix_tree_tag_set(root
, index
, tag
);
17 item_tag_clear(struct radix_tree_root
*root
, unsigned long index
, int tag
)
19 return radix_tree_tag_clear(root
, index
, tag
);
22 int item_tag_get(struct radix_tree_root
*root
, unsigned long index
, int tag
)
24 return radix_tree_tag_get(root
, index
, tag
);
27 int __item_insert(struct radix_tree_root
*root
, struct item
*item
)
29 return radix_tree_insert(root
, item
->index
, item
);
32 int item_insert(struct radix_tree_root
*root
, unsigned long index
)
34 return __item_insert(root
, item_create(index
));
37 int item_delete(struct radix_tree_root
*root
, unsigned long index
)
39 struct item
*item
= radix_tree_delete(root
, index
);
42 assert(item
->index
== index
);
49 struct item
*item_create(unsigned long index
)
51 struct item
*ret
= malloc(sizeof(*ret
));
57 void item_check_present(struct radix_tree_root
*root
, unsigned long index
)
61 item
= radix_tree_lookup(root
, index
);
63 assert(item
->index
== index
);
66 struct item
*item_lookup(struct radix_tree_root
*root
, unsigned long index
)
68 return radix_tree_lookup(root
, index
);
71 void item_check_absent(struct radix_tree_root
*root
, unsigned long index
)
75 item
= radix_tree_lookup(root
, index
);
80 * Scan only the passed (start, start+nr] for present items
82 void item_gang_check_present(struct radix_tree_root
*root
,
83 unsigned long start
, unsigned long nr
,
86 struct item
*items
[chunk
];
89 for (into
= 0; into
< nr
; ) {
91 int nr_to_find
= chunk
;
94 if (nr_to_find
> (nr
- into
))
95 nr_to_find
= nr
- into
;
97 nfound
= radix_tree_gang_lookup(root
, (void **)items
,
98 start
+ into
, nr_to_find
);
99 assert(nfound
== nr_to_find
);
100 for (i
= 0; i
< nfound
; i
++)
101 assert(items
[i
]->index
== start
+ into
+ i
);
107 * Scan the entire tree, only expecting present items (start, start+nr]
109 void item_full_scan(struct radix_tree_root
*root
, unsigned long start
,
110 unsigned long nr
, int chunk
)
112 struct item
*items
[chunk
];
113 unsigned long into
= 0;
114 unsigned long this_index
= start
;
118 // printf("%s(0x%08lx, 0x%08lx, %d)\n", __FUNCTION__, start, nr, chunk);
120 while ((nfound
= radix_tree_gang_lookup(root
, (void **)items
, into
,
122 // printf("At 0x%08lx, nfound=%d\n", into, nfound);
123 for (i
= 0; i
< nfound
; i
++) {
124 assert(items
[i
]->index
== this_index
);
127 // printf("Found 0x%08lx->0x%08lx\n",
128 // items[0]->index, items[nfound-1]->index);
132 assert(this_index
== start
+ nr
);
133 nfound
= radix_tree_gang_lookup(root
, (void **)items
,
138 static int verify_node(struct radix_tree_node
*slot
, unsigned int tag
,
139 unsigned int height
, int tagged
)
145 slot
= indirect_to_ptr(slot
);
147 /* Verify consistency at this level */
148 for (i
= 0; i
< RADIX_TREE_TAG_LONGS
; i
++) {
149 if (slot
->tags
[tag
][i
]) {
154 if (tagged
!= anyset
) {
155 printf("tag: %u, height %u, tagged: %d, anyset: %d\n", tag
, height
, tagged
, anyset
);
156 for (j
= 0; j
< RADIX_TREE_MAX_TAGS
; j
++) {
157 printf("tag %d: ", j
);
158 for (i
= 0; i
< RADIX_TREE_TAG_LONGS
; i
++)
159 printf("%016lx ", slot
->tags
[j
][i
]);
164 assert(tagged
== anyset
);
166 /* Go for next level */
168 for (i
= 0; i
< RADIX_TREE_MAP_SIZE
; i
++)
170 if (verify_node(slot
->slots
[i
], tag
, height
- 1,
171 !!test_bit(i
, slot
->tags
[tag
]))) {
172 printf("Failure at off %d\n", i
);
173 for (j
= 0; j
< RADIX_TREE_MAX_TAGS
; j
++) {
174 printf("tag %d: ", j
);
175 for (i
= 0; i
< RADIX_TREE_TAG_LONGS
; i
++)
176 printf("%016lx ", slot
->tags
[j
][i
]);
185 void verify_tag_consistency(struct radix_tree_root
*root
, unsigned int tag
)
189 verify_node(root
->rnode
, tag
, root
->height
, !!root_tag_get(root
, tag
));
192 void item_kill_tree(struct radix_tree_root
*root
)
194 struct item
*items
[32];
197 while ((nfound
= radix_tree_gang_lookup(root
, (void **)items
, 0, 32))) {
200 for (i
= 0; i
< nfound
; i
++) {
203 ret
= radix_tree_delete(root
, items
[i
]->index
);
204 assert(ret
== items
[i
]);
208 assert(radix_tree_gang_lookup(root
, (void **)items
, 0, 32) == 0);
209 assert(root
->rnode
== NULL
);
212 void tree_verify_min_height(struct radix_tree_root
*root
, int maxindex
)
214 assert(radix_tree_maxindex(root
->height
) >= maxindex
);
215 if (root
->height
> 1)
216 assert(radix_tree_maxindex(root
->height
-1) < maxindex
);
217 else if (root
->height
== 1)
218 assert(radix_tree_maxindex(root
->height
-1) <= maxindex
);