mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
test_maple_tree: test modifications while iterating
Add a testcase to ensure the iterator detects bad states on modifications and does what the user expects Link: https://lkml.kernel.org/r/20230120162650.984577-5-Liam.Howlett@oracle.com Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
50e81c82ad
commit
5159d64b33
@ -1709,6 +1709,74 @@ static noinline void check_forking(struct maple_tree *mt)
|
||||
mtree_destroy(&newmt);
|
||||
}
|
||||
|
||||
static noinline void check_iteration(struct maple_tree *mt)
|
||||
{
|
||||
int i, nr_entries = 125;
|
||||
void *val;
|
||||
MA_STATE(mas, mt, 0, 0);
|
||||
|
||||
for (i = 0; i <= nr_entries; i++)
|
||||
mtree_store_range(mt, i * 10, i * 10 + 9,
|
||||
xa_mk_value(i), GFP_KERNEL);
|
||||
|
||||
mt_set_non_kernel(99999);
|
||||
|
||||
i = 0;
|
||||
mas_lock(&mas);
|
||||
mas_for_each(&mas, val, 925) {
|
||||
MT_BUG_ON(mt, mas.index != i * 10);
|
||||
MT_BUG_ON(mt, mas.last != i * 10 + 9);
|
||||
/* Overwrite end of entry 92 */
|
||||
if (i == 92) {
|
||||
mas.index = 925;
|
||||
mas.last = 929;
|
||||
mas_store(&mas, val);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
/* Ensure mas_find() gets the next value */
|
||||
val = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, val != xa_mk_value(i));
|
||||
|
||||
mas_set(&mas, 0);
|
||||
i = 0;
|
||||
mas_for_each(&mas, val, 785) {
|
||||
MT_BUG_ON(mt, mas.index != i * 10);
|
||||
MT_BUG_ON(mt, mas.last != i * 10 + 9);
|
||||
/* Overwrite start of entry 78 */
|
||||
if (i == 78) {
|
||||
mas.index = 780;
|
||||
mas.last = 785;
|
||||
mas_store(&mas, val);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
val = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, val != xa_mk_value(i));
|
||||
|
||||
mas_set(&mas, 0);
|
||||
i = 0;
|
||||
mas_for_each(&mas, val, 765) {
|
||||
MT_BUG_ON(mt, mas.index != i * 10);
|
||||
MT_BUG_ON(mt, mas.last != i * 10 + 9);
|
||||
/* Overwrite end of entry 76 and advance to the end */
|
||||
if (i == 76) {
|
||||
mas.index = 760;
|
||||
mas.last = 765;
|
||||
mas_store(&mas, val);
|
||||
mas_next(&mas, ULONG_MAX);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
/* Make sure the next find returns the one after 765, 766-769 */
|
||||
val = mas_find(&mas, ULONG_MAX);
|
||||
MT_BUG_ON(mt, val != xa_mk_value(76));
|
||||
mas_unlock(&mas);
|
||||
mas_destroy(&mas);
|
||||
mt_set_non_kernel(0);
|
||||
}
|
||||
|
||||
static noinline void check_mas_store_gfp(struct maple_tree *mt)
|
||||
{
|
||||
|
||||
@ -2659,6 +2727,10 @@ static int maple_tree_seed(void)
|
||||
goto skip;
|
||||
#endif
|
||||
|
||||
mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
|
||||
check_iteration(&tree);
|
||||
mtree_destroy(&tree);
|
||||
|
||||
mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
|
||||
check_forking(&tree);
|
||||
mtree_destroy(&tree);
|
||||
|
Loading…
Reference in New Issue
Block a user