From: Liam R. Howlett Date: Tue, 15 Oct 2019 23:34:51 +0000 (-0400) Subject: maple_tree: Convert mtree_erase to match xarray interface X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=b20a79ca39ad76f968ce93cfde0afdb44535e0bb;p=users%2Fjedix%2Flinux-maple.git maple_tree: Convert mtree_erase to match xarray interface Return erased value instead of number of freed slots. This required a bit of a rework of the test cases. Also removed two test cases to verify new nodes were used as they were not necessary when the deleted range is an exact match for the insert. Signed-off-by: Liam R. Howlett --- diff --git a/include/linux/maple_tree.h b/include/linux/maple_tree.h index 826165e4cf69..b956d3724a47 100644 --- a/include/linux/maple_tree.h +++ b/include/linux/maple_tree.h @@ -214,7 +214,7 @@ int mtree_insert(struct maple_tree *mt, unsigned long index, void *entry, gfp_t gfp); int mtree_insert_range(struct maple_tree *mt, unsigned long first, unsigned long last, void *entry, gfp_t gfp); -int mtree_erase(struct maple_tree *mt, unsigned long index); +void *mtree_erase(struct maple_tree *mt, unsigned long index); void mtree_destroy(struct maple_tree *mt); /** diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 8c12ed33672e..9d949eaa6cf8 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -1038,7 +1038,7 @@ static inline unsigned char mas_data_end(const struct ma_state *mas, * @coalesce the number of slots that would be removed if copied/coalesced. * */ -static inline unsigned char ma_hard_data(unsigned long end, +static inline int ma_hard_data(unsigned long end, unsigned long coalesce) { return end - coalesce; @@ -4060,30 +4060,40 @@ static inline bool mas_skip_node(struct ma_state *mas) return true; } /* Private - * ma_erase() - Find the range in which index resides and erase the entire + * mas_erase() - Find the range in which index resides and erase the entire * range. * * Any previous pivots with no value will be set to the same pivot value. - * Return: the number of concurrent slots that are NULL or XA_DELETED_ENTRY. + * Return: the entry that was erased */ -static inline int ma_erase(struct ma_state *mas) +static inline void *mas_erase(struct ma_state *mas) { - enum maple_type type = mte_node_type(mas->node); - unsigned char slot_cnt = mt_slots[type]; - unsigned char pivot_cnt = mt_pivots[type]; + enum maple_type type; + unsigned char pivot_cnt; unsigned long piv_val; int slot, ret = 1; + void *entry = NULL; + + _mas_walk(mas); + if (mas_is_ptr(mas)) { + entry = mas->tree->ma_root; + mas->tree->ma_root = NULL; + return entry; + } slot = mas_get_slot(mas); + if (slot == MAPLE_NODE_SLOTS) + return NULL; + + type = mte_node_type(mas->node); + pivot_cnt = mt_pivots[type]; + entry = mte_get_rcu_slot(mas->node, slot); mte_update_rcu_slot(mas->node, slot, XA_DELETED_ENTRY); // dense nodes only need to set a single value. if (!pivot_cnt) - return ret; + goto done; - if ((slot >= slot_cnt - 1)) - piv_val = mas->max; - else - piv_val = mte_get_pivot(mas->node, slot); + piv_val = _mas_get_safe_pivot(mas, slot, type); while ((slot < pivot_cnt - 1)) { unsigned long this_pivot = mte_get_pivot(mas->node, slot + 1); @@ -4091,7 +4101,7 @@ static inline int ma_erase(struct ma_state *mas) break; // There is data for this pivot. - if (mte_get_rcu_slot(mas->node, slot + 1)) + if (!mt_is_empty(mte_get_rcu_slot(mas->node, slot + 1))) break; // empty slot above the erase. @@ -4110,8 +4120,9 @@ static inline int ma_erase(struct ma_state *mas) ret++; } +done: mas_coalesce(mas); - return ret; + return entry; } @@ -4292,21 +4303,17 @@ int mtree_next(struct maple_tree *mt, unsigned long index, unsigned long *next) return ret; } -int mtree_erase(struct maple_tree *mt, unsigned long index) +void *mtree_erase(struct maple_tree *mt, unsigned long index) { - int ret = -EINVAL; - int slot; + void *entry = NULL; MA_STATE(mas, mt, index, index); mtree_lock(mt); - _mas_walk(&mas); - slot = mas_get_slot(&mas); - if (slot != MAPLE_NODE_SLOTS) - ret = ma_erase(&mas); - + entry = mas_erase(&mas); mtree_unlock(mt); - return ret; + + return entry; } EXPORT_SYMBOL(mtree_erase); diff --git a/lib/test_maple_tree.c b/lib/test_maple_tree.c index 0d71cfb2b1ee..b9593a94ec08 100644 --- a/lib/test_maple_tree.c +++ b/lib/test_maple_tree.c @@ -58,7 +58,7 @@ static void *mtree_test_load(struct maple_tree *mt, unsigned long index) return mtree_load(mt, index); } -static int mtree_test_erase(struct maple_tree *mt, unsigned long index) +static void *mtree_test_erase(struct maple_tree *mt, unsigned long index) { return mtree_erase(mt, index); } @@ -145,12 +145,10 @@ static noinline void check_insert(struct maple_tree *mt, unsigned long index, MT_BUG_ON(mt, ret != 0); } -static noinline void check_erase(struct maple_tree *mt, unsigned long index) +static noinline void check_erase(struct maple_tree *mt, unsigned long index, + void *ptr) { - int ret = -EINVAL; - - ret = mtree_test_erase(mt, index); - MT_BUG_ON(mt, ret < 0); + MT_BUG_ON(mt, mtree_test_erase(mt, index) != ptr); } static noinline void check_dup_insert(struct maple_tree *mt, unsigned long index, void *ptr) @@ -491,6 +489,7 @@ static noinline void check_find_2(struct maple_tree *mt) #define erase_ptr(i) entry[i%2] #define erase_check_load(mt, i) check_load(mt, set[i], entry[i%2]) #define erase_check_insert(mt, i) check_insert(mt, set[i], entry[i%2]) +#define erase_check_erase(mt, i) check_erase(mt, set[i], entry[i%2]) static noinline void check_erase_testset(struct maple_tree *mt) { @@ -519,14 +518,14 @@ static noinline void check_erase_testset(struct maple_tree *mt) erase_check_load(mt, i); mt_set_non_kernel(2); - check_erase(mt, set[1]); + erase_check_erase(mt, 1); erase_check_load(mt, 0); check_load(mt, set[1], NULL); for (int i = 2; i < 4; i++) erase_check_load(mt, i); - check_erase(mt, set[2]); + erase_check_erase(mt, 2); erase_check_load(mt, 0); check_load(mt, set[1], NULL); check_load(mt, set[2], NULL); @@ -539,7 +538,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) erase_check_load(mt, i); // Check erase and load without an allocation. - check_erase(mt, set[1]); + erase_check_erase(mt, 1); erase_check_load(mt, 0); check_load(mt, set[1], NULL); for (int i = 2; i < 4; i++) @@ -550,9 +549,6 @@ static noinline void check_erase_testset(struct maple_tree *mt) root_node = mt->ma_root; erase_check_insert(mt, 1); - // The root node should be replaced to avoid writing a busy slot. - MT_BUG_ON(mt, root_node == mt->ma_root); - erase_check_load(mt, 0); check_load(mt, 5016, NULL); erase_check_load(mt, 1); @@ -561,7 +557,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) check_load(mt, 5018, NULL); erase_check_load(mt, 3); - check_erase(mt, set[2]); // erase 5017 to check append + erase_check_erase(mt, 2); // erase 5017 to check append erase_check_load(mt, 0); check_load(mt, 5016, NULL); erase_check_load(mt, 1); @@ -571,10 +567,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) erase_check_load(mt, 3); root_node = mt->ma_root; - mt_dump(mt); erase_check_insert(mt, 2); - // The root node should be replaced to avoid writing a busy slot. - MT_BUG_ON(mt, root_node == mt->ma_root); erase_check_load(mt, 0); check_load(mt, 5016, NULL); @@ -584,8 +577,8 @@ static noinline void check_erase_testset(struct maple_tree *mt) check_load(mt, 5018, NULL); erase_check_load(mt, 3); - check_erase(mt, set[2]); // erase 5017 to check append - check_erase(mt, set[0]); // erase 5015 to check append + erase_check_erase(mt, 2); // erase 5017 to check append + erase_check_erase(mt, 0); // erase 5015 to check append erase_check_insert(mt, 4); // 1000 < Should not split. check_load(mt, set[0], NULL); check_load(mt, 5016, NULL); @@ -606,7 +599,6 @@ static noinline void check_erase_testset(struct maple_tree *mt) // Coalesce testing erase_check_insert(mt, 0); erase_check_insert(mt, 2); - mt_dump(mt); for (int i = 5; i < 25; i++) { erase_check_insert(mt, i); @@ -615,14 +607,14 @@ static noinline void check_erase_testset(struct maple_tree *mt) } } - check_erase(mt, set[14]); //6015 + erase_check_erase(mt, 14); //6015 for (int i = 0; i < 25; i++) { if (i == 14) check_load(mt, set[i], NULL); else erase_check_load(mt, i); } - check_erase(mt, set[16]); //7002 + erase_check_erase(mt, 16); //7002 for (int i = 0; i < 25; i++) { if (i == 16 || i == 14) check_load(mt, set[i], NULL); @@ -631,7 +623,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } mt_set_non_kernel(1); - check_erase(mt, set[13]); //6012 + erase_check_erase(mt, 13); //6012 for (int i = 0; i < 25; i++) { if (i == 16 || i == 14 || i == 13) check_load(mt, set[i], NULL); @@ -639,7 +631,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) erase_check_load(mt, i); } - check_erase(mt, set[15]); //7003 + erase_check_erase(mt, 15); //7003 for (int i = 0; i < 25; i++) { if (i <= 16 && i >= 13) check_load(mt, set[i], NULL); @@ -648,7 +640,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } mt_set_non_kernel(2); - check_erase(mt, set[17]); //7008 *should* cause coalesce. + erase_check_erase(mt, 17); //7008 *should* cause coalesce. for (int i = 0; i < 25; i++) { if (i <= 17 && i >= 13) check_load(mt, set[i], NULL); @@ -657,8 +649,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } mt_set_non_kernel(1); - check_erase(mt, set[18]); //7012 - mt_dump(mt); + erase_check_erase(mt, 18); //7012 for (int i = 0; i < 25; i++) { if (i <= 18 && i >= 13) check_load(mt, set[i], NULL); @@ -666,7 +657,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) erase_check_load(mt, i); } - check_erase(mt, set[19]); //7015 + erase_check_erase(mt, 19); //7015 for (int i = 0; i < 25; i++) { if (i <= 19 && i >= 13) check_load(mt, set[i], NULL); @@ -675,7 +666,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } - check_erase(mt, set[20]); //8003 + erase_check_erase(mt, 20); //8003 for (int i = 0; i < 25; i++) { if (i <= 20 && i >= 13) check_load(mt, set[i], NULL); @@ -684,7 +675,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } mt_set_non_kernel(2); - check_erase(mt, set[21]); //8002 + erase_check_erase(mt, 21); //8002 for (int i = 0; i < 25; i++) { if (i <= 21 && i >= 13) check_load(mt, set[i], NULL); @@ -694,7 +685,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) mt_set_non_kernel(1); - check_erase(mt, set[22]); //8008 + erase_check_erase(mt, 22); //8008 for (int i = 0; i < 25; i++) { if (i <= 22 && i >= 13) check_load(mt, set[i], NULL); @@ -702,8 +693,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) erase_check_load(mt, i); } for (int i = 23; i < 25; i++) { - check_erase(mt, set[i]); - mt_dump(mt); + erase_check_erase(mt, i); } for (int i = 0; i < 25; i++) { if (i <= 25 && i >= 13) @@ -720,7 +710,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) mt_set_non_kernel(99); for (int i = 18; i < ARRAY_SIZE(set); i++) { - check_erase(mt, set[i]); + erase_check_erase(mt, i); for (int j = 0; j < ARRAY_SIZE(set); j++) { if (j < 18 || j > i) erase_check_load(mt, j); @@ -730,7 +720,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } mt_set_non_kernel(30); for (int i = 0; i < 18; i++) { - check_erase(mt, set[i]); + erase_check_erase(mt, i); for (int j = 0; j < ARRAY_SIZE(set); j++) { if (j < 18 && j > i) erase_check_load(mt, j); @@ -740,8 +730,7 @@ static noinline void check_erase_testset(struct maple_tree *mt) } erase_check_insert(mt, 8); erase_check_insert(mt, 9); - check_erase(mt, set[8]); - mt_dump(mt); + erase_check_erase(mt, 8); } static noinline void check_alloc_rev_range(struct maple_tree *mt) @@ -837,7 +826,6 @@ static noinline void check_alloc_rev_range(struct maple_tree *mt) check_insert_range(mt, range[i] >> 12, (range[i + 1] >> 12) - 1, xa_mk_value(range[i] >> 12), 0); } - mt_dump(mt); for (i = 0; i < req_range_cnt; i += 5) { check_mtree_alloc_rrange(mt, @@ -951,10 +939,8 @@ static noinline void check_alloc_range(struct maple_tree *mt) check_insert_range(mt, range[i] >> 12, (range[i + 1] >> 12) - 1, xa_mk_value(range[i] >> 12), 0); } - mt_dump(mt); for (i = 0; i < req_range_cnt; i += 5) { - printk("%s: insert %i\n", __func__, i); check_mtree_alloc_range(mt, req_range[i] >> 12, // start req_range[i+1] >> 12, // end