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;