]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: Rework mas_next_node again
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 9 Sep 2020 20:32:36 +0000 (16:32 -0400)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Fri, 30 Oct 2020 19:11:33 +0000 (15:11 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/maple_tree.c

index 8647337a66df3f6fdabe93652b654d9c29bd6274..0426085a56ac53f188b0d535945f47ea3f4d57d5 100644 (file)
@@ -3242,49 +3242,51 @@ static inline unsigned long mas_next_node(struct ma_state *mas,
        enum maple_type mt;
        void **slots;
 
+       if (mas_is_none(mas))
+               return mas->max;
+
+       if (mte_is_root(mas->node))
+               goto no_entry;
+
+       offset = mte_parent_slot(mas->node);
+       start_piv = mas_safe_pivot(mas, offset);
 restart_next_node:
        level = 0;
-       while (!mas_is_none(mas)) {
+       do {
                if (mte_is_root(mas->node))
                        goto no_entry;
 
                offset = mte_parent_slot(mas->node);
                mas_ascend(mas);
-               start_piv = mas_safe_pivot(mas, offset);
+               level++;
                if (mas_dead_node(mas, start_piv))
                        goto restart_next_node;
 
-               level++;
                mt = mte_node_type(mas->node);
                slots = ma_get_slots(mas_mn(mas), mt);
                prev_piv = mas_safe_pivot(mas, offset);
                if (prev_piv > max)
                        goto no_entry;
 
-               if (prev_piv == mas->max) // last in node.
-                       continue;
-
-               if (++offset >= mt_slots[mt])
-                       continue;
-
-               pivot = mas_safe_pivot(mas, offset);
-
-               // Descend, if necessary.
-               while (level > 1) {
-                       level--;
-                       mas->node = rcu_dereference(slots[offset]);
-                       mt = mte_node_type(mas->node);
-                       slots = ma_get_slots(mas_mn(mas), mt);
-                       offset = 0;
-                       pivot = mas_safe_pivot(mas, offset);
-               }
+       } while (prev_piv == mas->max);
 
+       ++offset;
+       pivot = mas_safe_pivot(mas, offset);
+       // Descend, if necessary.
+       while (level > 1) {
+               level--;
                mas->node = rcu_dereference(slots[offset]);
-               mas->min = prev_piv + 1;
-               mas->max = pivot;
-               return mas->max;
+               mt = mte_node_type(mas->node);
+               slots = ma_get_slots(mas_mn(mas), mt);
+               offset = 0;
+               pivot = mas_safe_pivot(mas, offset);
        }
 
+       mas->node = rcu_dereference(slots[offset]);
+       mas->min = prev_piv + 1;
+       mas->max = pivot;
+       return mas->max;
+
 no_entry:
        mas->node = MAS_NONE;
        return mas->max;