]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: use ma_get_slots() in mas_next_node loop
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 9 Sep 2020 16:01:57 +0000 (12:01 -0400)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Fri, 30 Oct 2020 19:11:29 +0000 (15:11 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/maple_tree.c

index f5ef8324e939591f3a8926ea9233ffd99ab38cfb..a58935b56a10208431ed1b8be5ca16a03fec4e32 100644 (file)
@@ -3242,35 +3242,37 @@ static inline unsigned long mas_next_node(struct ma_state *mas,
 restart_next_node:
        level = 0;
        while (1) {
-               unsigned char count;
-               int slot;
+               int offset;
                struct maple_enode *mn;
                unsigned long prev_piv;
+               enum maple_type mt;
+               void **slots;
 
                if (mte_is_root(mas->node) || mas->node == MAS_NONE)
                        goto no_entry;
 
                mn = mas->node;
-               slot = mas_offset(mas);
-               start_piv = mas_safe_pivot(mas, slot);
+               offset= mas_offset(mas);
+               start_piv = mas_safe_pivot(mas, offset);
                level++;
                mas_ascend(mas);
 
                if (mas_dead_node(mas, start_piv))
                        goto restart_next_node;
 
-               count = mt_slot_count(mas->node);
-               prev_piv = mas_safe_pivot(mas, slot);
-               while (++slot < count) {
-                       unsigned long pivot = mas_safe_pivot(mas, slot);
+               mt = mte_node_type(mas->node);
+               slots = ma_get_slots(mas_mn(mas), mt);
+               prev_piv = mas_safe_pivot(mas, offset);
+               while (++offset< mt_slots[mt]) {
+                       unsigned long pivot = mas_safe_pivot(mas, offset);
 
                        if (prev_piv > max)
                                goto no_entry;
 
-                       if (slot != 0 && pivot == 0)
+                       if (offset!= 0 && pivot == 0)
                                break;
 
-                       mn = mas_get_slot(mas, slot);
+                       mn = rcu_dereference(slots[offset]);
                        if (!mn) {
                                prev_piv = pivot;
                                continue;
@@ -3280,7 +3282,7 @@ restart_next_node:
                        mas->max = pivot;
 
                        if (level == 1) {
-                               mas_set_offset(mas, slot);
+                               mas_set_offset(mas, offset);
                                mas->node = mn;
                                if (mas_dead_node(mas, start_piv))
                                        goto restart_next_node;
@@ -3290,8 +3292,9 @@ restart_next_node:
 
                        level--;
                        mas->node = mn;
-                       slot = -1;
-                       count = mt_slot_count(mas->node);
+                       offset = -1;
+                       mt = mte_node_type(mas->node);
+                       slots = ma_get_slots(mas_mn(mas), mt);
                }
 
                if (mte_is_root(mas->node))