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
,
30 return __radix_tree_insert(root
, item
->index
, order
, item
);
33 int item_insert(struct radix_tree_root
*root
, unsigned long index
)
35 return __item_insert(root
, item_create(index
), 0);
38 int item_insert_order(struct radix_tree_root
*root
, unsigned long index
,
41 return __item_insert(root
, item_create(index
), order
);
44 int item_delete(struct radix_tree_root
*root
, unsigned long index
)
46 struct item
*item
= radix_tree_delete(root
, index
);
49 assert(item
->index
== index
);
56 struct item
*item_create(unsigned long index
)
58 struct item
*ret
= malloc(sizeof(*ret
));
64 void item_check_present(struct radix_tree_root
*root
, unsigned long index
)
68 item
= radix_tree_lookup(root
, index
);
70 assert(item
->index
== index
);
73 struct item
*item_lookup(struct radix_tree_root
*root
, unsigned long index
)
75 return radix_tree_lookup(root
, index
);
78 void item_check_absent(struct radix_tree_root
*root
, unsigned long index
)
82 item
= radix_tree_lookup(root
, index
);
87 * Scan only the passed (start, start+nr] for present items
89 void item_gang_check_present(struct radix_tree_root
*root
,
90 unsigned long start
, unsigned long nr
,
93 struct item
*items
[chunk
];
96 for (into
= 0; into
< nr
; ) {
98 int nr_to_find
= chunk
;
101 if (nr_to_find
> (nr
- into
))
102 nr_to_find
= nr
- into
;
104 nfound
= radix_tree_gang_lookup(root
, (void **)items
,
105 start
+ into
, nr_to_find
);
106 assert(nfound
== nr_to_find
);
107 for (i
= 0; i
< nfound
; i
++)
108 assert(items
[i
]->index
== start
+ into
+ i
);
114 * Scan the entire tree, only expecting present items (start, start+nr]
116 void item_full_scan(struct radix_tree_root
*root
, unsigned long start
,
117 unsigned long nr
, int chunk
)
119 struct item
*items
[chunk
];
120 unsigned long into
= 0;
121 unsigned long this_index
= start
;
125 // printf("%s(0x%08lx, 0x%08lx, %d)\n", __FUNCTION__, start, nr, chunk);
127 while ((nfound
= radix_tree_gang_lookup(root
, (void **)items
, into
,
129 // printf("At 0x%08lx, nfound=%d\n", into, nfound);
130 for (i
= 0; i
< nfound
; i
++) {
131 assert(items
[i
]->index
== this_index
);
134 // printf("Found 0x%08lx->0x%08lx\n",
135 // items[0]->index, items[nfound-1]->index);
139 assert(this_index
== start
+ nr
);
140 nfound
= radix_tree_gang_lookup(root
, (void **)items
,
145 static int verify_node(struct radix_tree_node
*slot
, unsigned int tag
,
152 slot
= entry_to_node(slot
);
154 /* Verify consistency at this level */
155 for (i
= 0; i
< RADIX_TREE_TAG_LONGS
; i
++) {
156 if (slot
->tags
[tag
][i
]) {
161 if (tagged
!= anyset
) {
162 printf("tag: %u, shift %u, tagged: %d, anyset: %d\n",
163 tag
, slot
->shift
, tagged
, anyset
);
164 for (j
= 0; j
< RADIX_TREE_MAX_TAGS
; j
++) {
165 printf("tag %d: ", j
);
166 for (i
= 0; i
< RADIX_TREE_TAG_LONGS
; i
++)
167 printf("%016lx ", slot
->tags
[j
][i
]);
172 assert(tagged
== anyset
);
174 /* Go for next level */
175 if (slot
->shift
> 0) {
176 for (i
= 0; i
< RADIX_TREE_MAP_SIZE
; i
++)
178 if (verify_node(slot
->slots
[i
], tag
,
179 !!test_bit(i
, slot
->tags
[tag
]))) {
180 printf("Failure at off %d\n", i
);
181 for (j
= 0; j
< RADIX_TREE_MAX_TAGS
; j
++) {
182 printf("tag %d: ", j
);
183 for (i
= 0; i
< RADIX_TREE_TAG_LONGS
; i
++)
184 printf("%016lx ", slot
->tags
[j
][i
]);
193 void verify_tag_consistency(struct radix_tree_root
*root
, unsigned int tag
)
195 struct radix_tree_node
*node
= root
->rnode
;
196 if (!radix_tree_is_internal_node(node
))
198 verify_node(node
, tag
, !!root_tag_get(root
, tag
));
201 void item_kill_tree(struct radix_tree_root
*root
)
203 struct item
*items
[32];
206 while ((nfound
= radix_tree_gang_lookup(root
, (void **)items
, 0, 32))) {
209 for (i
= 0; i
< nfound
; i
++) {
212 ret
= radix_tree_delete(root
, items
[i
]->index
);
213 assert(ret
== items
[i
]);
217 assert(radix_tree_gang_lookup(root
, (void **)items
, 0, 32) == 0);
218 assert(root
->rnode
== NULL
);
221 void tree_verify_min_height(struct radix_tree_root
*root
, int maxindex
)
224 struct radix_tree_node
*node
= root
->rnode
;
225 if (!radix_tree_is_internal_node(node
)) {
226 assert(maxindex
== 0);
230 node
= entry_to_node(node
);
231 assert(maxindex
<= node_maxindex(node
));
235 assert(maxindex
> shift_maxindex(shift
- RADIX_TREE_MAP_SHIFT
));
237 assert(maxindex
> 0);