aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/radix-tree/multiorder.c
diff options
context:
space:
mode:
authorMatthew Wilcox <willy@linux.intel.com>2016-05-20 20:03:36 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-20 20:58:30 -0400
commit8c1244de00ef98f73e21eecc42d84b2742fbb4f9 (patch)
tree387657f853337b8fffe77215c9254c2ccb2a2ca4 /tools/testing/radix-tree/multiorder.c
parentaf49a63e101eb62376cc1d6bd25b97eb8c691d54 (diff)
radix-tree: tidy up next_chunk
Convert radix_tree_next_chunk to use 'child' instead of 'slot' as the name of the child node. Also use node_maxindex() where it makes sense. The 'rnode' variable was unnecessary; it doesn't overlap in usage with 'node', so we can just use 'node' the whole way through the function. Improve the testcase to start the walk from every index in the carefully constructed tree, and to accept any index within the range covered by the entry. Signed-off-by: Matthew Wilcox <willy@linux.intel.com> Cc: Konstantin Khlebnikov <koct9i@gmail.com> Cc: Kirill Shutemov <kirill.shutemov@linux.intel.com> Cc: Jan Kara <jack@suse.com> Cc: Neil Brown <neilb@suse.de> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'tools/testing/radix-tree/multiorder.c')
-rw-r--r--tools/testing/radix-tree/multiorder.c99
1 files changed, 55 insertions, 44 deletions
diff --git a/tools/testing/radix-tree/multiorder.c b/tools/testing/radix-tree/multiorder.c
index c061f4bd6c05..39d9b9568fe2 100644
--- a/tools/testing/radix-tree/multiorder.c
+++ b/tools/testing/radix-tree/multiorder.c
@@ -202,7 +202,7 @@ void multiorder_iteration(void)
202 RADIX_TREE(tree, GFP_KERNEL); 202 RADIX_TREE(tree, GFP_KERNEL);
203 struct radix_tree_iter iter; 203 struct radix_tree_iter iter;
204 void **slot; 204 void **slot;
205 int i, err; 205 int i, j, err;
206 206
207 printf("Multiorder iteration test\n"); 207 printf("Multiorder iteration test\n");
208 208
@@ -215,29 +215,21 @@ void multiorder_iteration(void)
215 assert(!err); 215 assert(!err);
216 } 216 }
217 217
218 i = 0; 218 for (j = 0; j < 256; j++) {
219 /* start from index 1 to verify we find the multi-order entry at 0 */ 219 for (i = 0; i < NUM_ENTRIES; i++)
220 radix_tree_for_each_slot(slot, &tree, &iter, 1) { 220 if (j <= (index[i] | ((1 << order[i]) - 1)))
221 int height = order[i] / RADIX_TREE_MAP_SHIFT; 221 break;
222 int shift = height * RADIX_TREE_MAP_SHIFT; 222
223 223 radix_tree_for_each_slot(slot, &tree, &iter, j) {
224 assert(iter.index == index[i]); 224 int height = order[i] / RADIX_TREE_MAP_SHIFT;
225 assert(iter.shift == shift); 225 int shift = height * RADIX_TREE_MAP_SHIFT;
226 i++; 226 int mask = (1 << order[i]) - 1;
227 } 227
228 228 assert(iter.index >= (index[i] &~ mask));
229 /* 229 assert(iter.index <= (index[i] | mask));
230 * Now iterate through the tree starting at an elevated multi-order 230 assert(iter.shift == shift);
231 * entry, beginning at an index in the middle of the range. 231 i++;
232 */ 232 }
233 i = 8;
234 radix_tree_for_each_slot(slot, &tree, &iter, 70) {
235 int height = order[i] / RADIX_TREE_MAP_SHIFT;
236 int shift = height * RADIX_TREE_MAP_SHIFT;
237
238 assert(iter.index == index[i]);
239 assert(iter.shift == shift);
240 i++;
241 } 233 }
242 234
243 item_kill_tree(&tree); 235 item_kill_tree(&tree);
@@ -249,7 +241,7 @@ void multiorder_tagged_iteration(void)
249 struct radix_tree_iter iter; 241 struct radix_tree_iter iter;
250 void **slot; 242 void **slot;
251 unsigned long first = 0; 243 unsigned long first = 0;
252 int i; 244 int i, j;
253 245
254 printf("Multiorder tagged iteration test\n"); 246 printf("Multiorder tagged iteration test\n");
255 247
@@ -268,30 +260,49 @@ void multiorder_tagged_iteration(void)
268 for (i = 0; i < TAG_ENTRIES; i++) 260 for (i = 0; i < TAG_ENTRIES; i++)
269 assert(radix_tree_tag_set(&tree, tag_index[i], 1)); 261 assert(radix_tree_tag_set(&tree, tag_index[i], 1));
270 262
271 i = 0; 263 for (j = 0; j < 256; j++) {
272 /* start from index 1 to verify we find the multi-order entry at 0 */ 264 int mask, k;
273 radix_tree_for_each_tagged(slot, &tree, &iter, 1, 1) { 265
274 assert(iter.index == tag_index[i]); 266 for (i = 0; i < TAG_ENTRIES; i++) {
275 i++; 267 for (k = i; index[k] < tag_index[i]; k++)
276 } 268 ;
277 269 if (j <= (index[k] | ((1 << order[k]) - 1)))
278 /* 270 break;
279 * Now iterate through the tree starting at an elevated multi-order 271 }
280 * entry, beginning at an index in the middle of the range. 272
281 */ 273 radix_tree_for_each_tagged(slot, &tree, &iter, j, 1) {
282 i = 4; 274 for (k = i; index[k] < tag_index[i]; k++)
283 radix_tree_for_each_slot(slot, &tree, &iter, 70) { 275 ;
284 assert(iter.index == tag_index[i]); 276 mask = (1 << order[k]) - 1;
285 i++; 277
278 assert(iter.index >= (tag_index[i] &~ mask));
279 assert(iter.index <= (tag_index[i] | mask));
280 i++;
281 }
286 } 282 }
287 283
288 radix_tree_range_tag_if_tagged(&tree, &first, ~0UL, 284 radix_tree_range_tag_if_tagged(&tree, &first, ~0UL,
289 MT_NUM_ENTRIES, 1, 2); 285 MT_NUM_ENTRIES, 1, 2);
290 286
291 i = 0; 287 for (j = 0; j < 256; j++) {
292 radix_tree_for_each_tagged(slot, &tree, &iter, 1, 2) { 288 int mask, k;
293 assert(iter.index == tag_index[i]); 289
294 i++; 290 for (i = 0; i < TAG_ENTRIES; i++) {
291 for (k = i; index[k] < tag_index[i]; k++)
292 ;
293 if (j <= (index[k] | ((1 << order[k]) - 1)))
294 break;
295 }
296
297 radix_tree_for_each_tagged(slot, &tree, &iter, j, 2) {
298 for (k = i; index[k] < tag_index[i]; k++)
299 ;
300 mask = (1 << order[k]) - 1;
301
302 assert(iter.index >= (tag_index[i] &~ mask));
303 assert(iter.index <= (tag_index[i] | mask));
304 i++;
305 }
295 } 306 }
296 307
297 first = 1; 308 first = 1;