static void single_thread_tests(bool long_run) { int i; printv(1, "starting single_thread_tests: %d allocated, preempt %d\n", nr_allocated, preempt_count); multiorder_checks(); rcu_barrier(); printv(2, "after multiorder_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); tag_check(); rcu_barrier(); printv(2, "after tag_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); gang_check(); rcu_barrier(); printv(2, "after gang_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); add_and_check(); rcu_barrier(); printv(2, "after add_and_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); dynamic_height_check(); rcu_barrier(); printv(2, "after dynamic_height_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); idr_checks(); ida_tests(); rcu_barrier(); printv(2, "after idr_checks: %d allocated, preempt %d\n", nr_allocated, preempt_count); big_gang_check(long_run); rcu_barrier(); printv(2, "after big_gang_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); for (i = 0; i < (long_run ? 2000 : 3); i++) { copy_tag_check(); printv(2, "%d ", i); fflush(stdout); } rcu_barrier(); printv(2, "after copy_tag_check: %d allocated, preempt %d\n", nr_allocated, preempt_count); }
static void single_thread_tests(void) { int i; tag_check(); printf("after tag_check: %d allocated\n", nr_allocated); gang_check(); printf("after gang_check: %d allocated\n", nr_allocated); add_and_check(); printf("after add_and_check: %d allocated\n", nr_allocated); dynamic_height_check(); printf("after dynamic_height_check: %d allocated\n", nr_allocated); big_gang_check(); printf("after big_gang_check: %d allocated\n", nr_allocated); for (i = 0; i < 2000; i++) { copy_tag_check(); printf("%d ", i); fflush(stdout); } printf("after copy_tag_check: %d allocated\n", nr_allocated); }
static void do_thrash(struct radix_tree_root *tree, char *thrash_state, int tag) { int insert_chunk; int delete_chunk; int tag_chunk; int untag_chunk; int total_tagged = 0; int total_present = 0; for (insert_chunk = 1; insert_chunk < THRASH_SIZE; insert_chunk *= N) for (delete_chunk = 1; delete_chunk < THRASH_SIZE; delete_chunk *= N) for (tag_chunk = 1; tag_chunk < THRASH_SIZE; tag_chunk *= N) for (untag_chunk = 1; untag_chunk < THRASH_SIZE; untag_chunk *= N) { int i; unsigned long index; int nr_inserted = 0; int nr_deleted = 0; int nr_tagged = 0; int nr_untagged = 0; int actual_total_tagged; int actual_total_present; for (i = 0; i < insert_chunk; i++) { index = rand() % THRASH_SIZE; if (thrash_state[index] != NODE_ABSENT) continue; item_check_absent(tree, index); item_insert(tree, index); assert(thrash_state[index] != NODE_PRESENT); thrash_state[index] = NODE_PRESENT; nr_inserted++; total_present++; } for (i = 0; i < delete_chunk; i++) { index = rand() % THRASH_SIZE; if (thrash_state[index] == NODE_ABSENT) continue; item_check_present(tree, index); if (item_tag_get(tree, index, tag)) { assert(thrash_state[index] == NODE_TAGGED); total_tagged--; } else { assert(thrash_state[index] == NODE_PRESENT); } item_delete(tree, index); assert(thrash_state[index] != NODE_ABSENT); thrash_state[index] = NODE_ABSENT; nr_deleted++; total_present--; } for (i = 0; i < tag_chunk; i++) { index = rand() % THRASH_SIZE; if (thrash_state[index] != NODE_PRESENT) { if (item_lookup(tree, index)) assert(item_tag_get(tree, index, tag)); continue; } item_tag_set(tree, index, tag); item_tag_set(tree, index, tag); assert(thrash_state[index] != NODE_TAGGED); thrash_state[index] = NODE_TAGGED; nr_tagged++; total_tagged++; } for (i = 0; i < untag_chunk; i++) { index = rand() % THRASH_SIZE; if (thrash_state[index] != NODE_TAGGED) continue; item_check_present(tree, index); assert(item_tag_get(tree, index, tag)); item_tag_clear(tree, index, tag); item_tag_clear(tree, index, tag); assert(thrash_state[index] != NODE_PRESENT); thrash_state[index] = NODE_PRESENT; nr_untagged++; total_tagged--; } actual_total_tagged = 0; actual_total_present = 0; for (index = 0; index < THRASH_SIZE; index++) { switch (thrash_state[index]) { case NODE_ABSENT: item_check_absent(tree, index); break; case NODE_PRESENT: item_check_present(tree, index); assert(!item_tag_get(tree, index, tag)); actual_total_present++; break; case NODE_TAGGED: item_check_present(tree, index); assert(item_tag_get(tree, index, tag)); actual_total_present++; actual_total_tagged++; break; } } gang_check(tree, thrash_state, tag); printf("%d(%d) %d(%d) %d(%d) %d(%d) / " "%d(%d) present, %d(%d) tagged\n", insert_chunk, nr_inserted, delete_chunk, nr_deleted, tag_chunk, nr_tagged, untag_chunk, nr_untagged, total_present, actual_total_present, total_tagged, actual_total_tagged); } }