maple_tree: Optimise mas_wr_store_entry() and mas_prealloc_calc()
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Fri, 29 Nov 2024 16:28:33 +0000 (11:28 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Sat, 30 Nov 2024 02:12:22 +0000 (21:12 -0500)
Rearrange the switch statements so that the more likely code paths are
checked first.

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/maple_tree.c

index ff3f04a2bce1ab63722f2215a66c69c11cff7ace..07bacec3d97896c44dede51522febfd4d0e43cb7 100644 (file)
@@ -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;