From: Liam R. Howlett <Liam.Howlett@Oracle.com> Date: Fri, 29 Nov 2024 16:28:33 +0000 (-0500) Subject: maple_tree: Optimise mas_wr_store_entry() and mas_prealloc_calc() X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=88562e3b538db9a41b078aff9021ee70d3b67903;p=users%2Fjedix%2Flinux-maple.git maple_tree: Optimise mas_wr_store_entry() and mas_prealloc_calc() Rearrange the switch statements so that the more likely code paths are checked first. Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com> --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index bf6ec313e77e..8fc6a8280daa 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -4103,6 +4103,7 @@ static void mas_wr_walk_index(struct ma_wr_state *wr_mas) mas_wr_walk_traverse(wr_mas); } } + /* * mas_extend_spanning_null() - Extend a store of a %NULL to include surrounding %NULLs. * @l_wr_mas: The left maple write state @@ -4596,38 +4597,38 @@ static inline void mas_wr_store_entry(struct ma_wr_state *wr_mas) unsigned char new_end = mas_wr_new_end(wr_mas); switch (mas->store_type) { - case wr_invalid: - MT_BUG_ON(mas->tree, 1); - return; - case wr_new_root: - mas_new_root(mas, wr_mas->entry); + case wr_slot_store: + mas_wr_slot_store(wr_mas); break; - case wr_store_root: - mas_store_root(mas, wr_mas->entry); + case wr_node_store: + mas_wr_node_store(wr_mas, new_end); + break; + case wr_split_store: + mas_wr_split(wr_mas); + break; + case wr_rebalance: + mas_wr_bnode(wr_mas); break; case wr_exact_fit: rcu_assign_pointer(wr_mas->slots[mas->offset], wr_mas->entry); if (!!wr_mas->entry ^ !!wr_mas->content) mas_update_gap(mas); break; - case wr_append: - mas_wr_append(wr_mas, new_end); + case wr_new_root: + mas_new_root(mas, wr_mas->entry); break; - case wr_slot_store: - mas_wr_slot_store(wr_mas); + case wr_store_root: + mas_store_root(mas, wr_mas->entry); break; - case wr_node_store: - mas_wr_node_store(wr_mas, new_end); + case wr_append: + mas_wr_append(wr_mas, new_end); break; case wr_spanning_store: mas_wr_spanning_store(wr_mas); break; - case wr_split_store: - mas_wr_split(wr_mas); - break; - case wr_rebalance: - mas_wr_bnode(wr_mas); - break; + case wr_invalid: + MT_BUG_ON(mas->tree, 1); + return; } return; @@ -4689,8 +4690,19 @@ static inline int mas_prealloc_calc(struct ma_state *mas, void *entry) int ret = mas_mt_height(mas) * 3 + 1; switch (mas->store_type) { - case wr_invalid: - WARN_ON_ONCE(1); + case wr_node_store: + ret = mt_in_rcu(mas->tree) ? 1 : 0; + break; + case wr_split_store: + ret = mas_mt_height(mas) * 2 + 1; + break; + case wr_rebalance: + ret = mas_mt_height(mas) * 2 - 1; + break; + case wr_append: + case wr_exact_fit: + case wr_slot_store: + ret = 0; break; case wr_new_root: ret = 1; @@ -4706,19 +4718,9 @@ static inline int mas_prealloc_calc(struct ma_state *mas, void *entry) case wr_spanning_store: ret = mas_mt_height(mas) * 3 + 1; break; - case wr_split_store: - ret = mas_mt_height(mas) * 2 + 1; - break; - case wr_rebalance: - ret = mas_mt_height(mas) * 2 - 1; - break; - case wr_node_store: - ret = mt_in_rcu(mas->tree) ? 1 : 0; + case wr_invalid: + WARN_ON_ONCE(1); break; - case wr_append: - case wr_exact_fit: - case wr_slot_store: - ret = 0; } return ret; @@ -4734,7 +4736,7 @@ static inline int mas_prealloc_calc(struct ma_state *mas, void *entry) static inline enum store_type mas_wr_store_type(struct ma_wr_state *wr_mas) { struct ma_state *mas = wr_mas->mas; - unsigned char new_end; + int new_end; if (unlikely(mas_is_none(mas) || mas_is_ptr(mas))) return wr_store_root;