#define __param(type, name, init, msg) \ static type name = init; \
module_param(name, type, 0444); \
MODULE_PARM_DESC(name, msg);
__param(int, nnodes, 100, "Number of nodes in the interval tree");
__param(int, perf_loops, 1000, "Number of iterations modifying the tree");
__param(int, nsearches, 100, "Number of searches to the interval tree");
__param(int, search_loops, 1000, "Number of iterations searching the tree");
__param(bool, search_all, false, "Searches will iterate all nodes in the tree");
__param(uint, max_endpoint, ~0, "Largest value for the interval's endpoint");
__param(ullong, seed, 3141592653589793238ULL, "Random seed");
for (i = 0; i < nnodes; i++) {
u32 b = (prandom_u32_state(&rnd) >> 4) % max_endpoint;
u32 a = (prandom_u32_state(&rnd) >> 4) % b;
nodes[i].start = a;
nodes[i].last = b;
}
/* * Limit the search scope to what the user defined. * Otherwise we are merely measuring empty walks, * which is pointless.
*/ for (i = 0; i < nsearches; i++)
queries[i] = (prandom_u32_state(&rnd) >> 4) % max_endpoint;
}
staticint basic_check(void)
{ int i, j;
cycles_t time1, time2, time;
printk(KERN_ALERT "interval tree insert/remove");
init();
time1 = get_cycles();
for (i = 0; i < perf_loops; i++) { for (j = 0; j < nnodes; j++)
interval_tree_insert(nodes + j, &root); for (j = 0; j < nnodes; j++)
interval_tree_remove(nodes + j, &root);
}
time2 = get_cycles();
time = time2 - time1;
time = div_u64(time, perf_loops);
printk(" -> %llu cycles\n", (unsignedlonglong)time);
return 0;
}
staticint search_check(void)
{ int i, j; unsignedlong results;
cycles_t time1, time2, time;
staticint intersection_range_check(void)
{ int i, j, k; unsignedlong start, last; struct interval_tree_node *node; unsignedlong *intxn1; unsignedlong *intxn2;
printk(KERN_ALERT "interval tree iteration\n");
intxn1 = bitmap_alloc(nnodes, GFP_KERNEL); if (!intxn1) {
WARN_ON_ONCE("Failed to allocate intxn1\n"); return -ENOMEM;
}
intxn2 = bitmap_alloc(nnodes, GFP_KERNEL); if (!intxn2) {
WARN_ON_ONCE("Failed to allocate intxn2\n");
bitmap_free(intxn1); return -ENOMEM;
}
for (i = 0; i < search_loops; i++) { /* Initialize interval tree for each round */
init(); for (j = 0; j < nnodes; j++)
interval_tree_insert(nodes + j, &root);
/* Let's try nsearches different ranges */ for (k = 0; k < nsearches; k++) { /* Try whole range once */ if (!k) {
start = 0UL;
last = ULONG_MAX;
} else {
last = (prandom_u32_state(&rnd) >> 4) % max_endpoint;
start = (prandom_u32_state(&rnd) >> 4) % last;
}
/* Walk nodes to mark intersection nodes */
bitmap_zero(intxn1, nnodes); for (j = 0; j < nnodes; j++) {
node = nodes + j;
if (start <= node->last && last >= node->start)
bitmap_set(intxn1, j, 1);
}
/* Iterate tree to clear intersection nodes */
bitmap_zero(intxn2, nnodes); for (node = interval_tree_iter_first(&root, start, last); node;
node = interval_tree_iter_next(node, start, last))
bitmap_set(intxn2, node - nodes, 1);
#ifdef CONFIG_INTERVAL_TREE_SPAN_ITER /* * Helper function to get span of current position from maple tree point of * view.
*/ staticvoid mas_cur_span(struct ma_state *mas, struct interval_tree_span_iter *state)
{ unsignedlong cur_start; unsignedlong cur_last; int is_hole;
if (mas->status == ma_overflow) return;
/* walk to current position */
state->is_hole = mas_walk(mas) ? 0 : 1;
/* advance position for next round */ if (mas->status != ma_overflow)
mas_set(mas, cur_last + 1);
}
staticint span_iteration_check(void)
{ int i, j, k; unsignedlong start, last; struct interval_tree_span_iter span, mas_span;
DEFINE_MTREE(tree);
MA_STATE(mas, &tree, 0, 0);
printk(KERN_ALERT "interval tree span iteration\n");
for (i = 0; i < search_loops; i++) { /* Initialize interval tree for each round */
init(); for (j = 0; j < nnodes; j++)
interval_tree_insert(nodes + j, &root);
/* Put all the range into maple tree */
mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
mt_set_in_rcu(&tree);
/* Cleanup maple tree for each round */
mtree_destroy(&tree); /* Cleanup interval tree for each round */ for (j = 0; j < nnodes; j++)
interval_tree_remove(nodes + j, &root);
} return 0;
} #else staticinlineint span_iteration_check(void) {return 0; } #endif
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.