diff options
| author | Dmitry Torokhov <[email protected]> | 2023-05-01 15:20:08 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-05-01 15:20:08 -0700 | 
| commit | 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e (patch) | |
| tree | d57f3a63479a07b4e0cece029886e76e04feb984 /lib/test_maple_tree.c | |
| parent | 5dc63e56a9cf8df0b59c234a505a1653f1bdf885 (diff) | |
| parent | 53bea86b5712c7491bb3dae12e271666df0a308c (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.4 merge window.
Diffstat (limited to 'lib/test_maple_tree.c')
| -rw-r--r-- | lib/test_maple_tree.c | 161 | 
1 files changed, 161 insertions, 0 deletions
diff --git a/lib/test_maple_tree.c b/lib/test_maple_tree.c index 497fc93ccf9e..3d19b1f78d71 100644 --- a/lib/test_maple_tree.c +++ b/lib/test_maple_tree.c @@ -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)  { @@ -2517,6 +2585,91 @@ static noinline void check_bnode_min_spanning(struct maple_tree *mt)  	mt_set_non_kernel(0);  } +static noinline void check_empty_area_window(struct maple_tree *mt) +{ +	unsigned long i, nr_entries = 20; +	MA_STATE(mas, mt, 0, 0); + +	for (i = 1; i <= nr_entries; i++) +		mtree_store_range(mt, i*10, i*10 + 9, +				  xa_mk_value(i), GFP_KERNEL); + +	/* Create another hole besides the one at 0 */ +	mtree_store_range(mt, 160, 169, NULL, GFP_KERNEL); + +	/* Check lower bounds that don't fit */ +	rcu_read_lock(); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 10) != -EBUSY); + +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 6, 90, 5) != -EBUSY); + +	/* Check lower bound that does fit */ +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 5) != 0); +	MT_BUG_ON(mt, mas.index != 5); +	MT_BUG_ON(mt, mas.last != 9); +	rcu_read_unlock(); + +	/* Check one gap that doesn't fit and one that does */ +	rcu_read_lock(); +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 217, 9) != 0); +	MT_BUG_ON(mt, mas.index != 161); +	MT_BUG_ON(mt, mas.last != 169); + +	/* Check one gap that does fit above the min */ +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 3) != 0); +	MT_BUG_ON(mt, mas.index != 216); +	MT_BUG_ON(mt, mas.last != 218); + +	/* Check size that doesn't fit any gap */ +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 16) != -EBUSY); + +	/* +	 * Check size that doesn't fit the lower end of the window but +	 * does fit the gap +	 */ +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 167, 200, 4) != -EBUSY); + +	/* +	 * Check size that doesn't fit the upper end of the window but +	 * does fit the gap +	 */ +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 162, 4) != -EBUSY); + +	/* Check mas_empty_area forward */ +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 9) != 0); +	MT_BUG_ON(mt, mas.index != 0); +	MT_BUG_ON(mt, mas.last != 8); + +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 4) != 0); +	MT_BUG_ON(mt, mas.index != 0); +	MT_BUG_ON(mt, mas.last != 3); + +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 11) != -EBUSY); + +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area(&mas, 5, 100, 6) != -EBUSY); + +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area(&mas, 0, 8, 10) != -EBUSY); + +	mas_reset(&mas); +	mas_empty_area(&mas, 100, 165, 3); + +	mas_reset(&mas); +	MT_BUG_ON(mt, mas_empty_area(&mas, 100, 163, 6) != -EBUSY); +	rcu_read_unlock(); +} +  static DEFINE_MTREE(tree);  static int maple_tree_seed(void)  { @@ -2575,6 +2728,10 @@ static int maple_tree_seed(void)  #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); @@ -2765,6 +2922,10 @@ static int maple_tree_seed(void)  	check_bnode_min_spanning(&tree);  	mtree_destroy(&tree); +	mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE); +	check_empty_area_window(&tree); +	mtree_destroy(&tree); +  #if defined(BENCH)  skip:  #endif  |