maple_tree: mtree_range_walk() clean up
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Wed, 1 Nov 2023 17:16:29 +0000 (13:16 -0400)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 12 Dec 2023 18:56:59 +0000 (10:56 -0800)
mtree_range_walk() needed to be updated to avoid checking if there was a
pivot value.  On closer examination, the code could avoid setting min or
max in certain scenarios.  The commit removes the extra check for
pivot[offset] before setting max and only sets max when necessary.  It
also only sets min if it is necessary by checking offset 0 prior to the
loop (as it has always done).

The commit also drops a dead node check since the end of the node will
return the array size when the last slot is occupied (by a potential reuse
in a dead node).  The data will be discarded later if the node is marked
dead.

Benchmarking these changes results in an increase in performance of 5.45%
using the BENCH_WALK in the maple tree test code.

Link: https://lkml.kernel.org/r/20231101171629.3612299-13-Liam.Howlett@oracle.com
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Peng Zhang <zhangpeng.00@bytedance.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/maple_tree.c

index bc62122a4b15a93418baf709ee9ef09b80d9a665..925c5742a57d2e63d8f439afb814d23ebec64605 100644 (file)
@@ -2806,32 +2806,29 @@ static inline void *mtree_range_walk(struct ma_state *mas)
        min = mas->min;
        max = mas->max;
        do {
-               offset = 0;
                last = next;
                node = mte_to_node(next);
                type = mte_node_type(next);
                pivots = ma_pivots(node, type);
                end = ma_data_end(node, type, pivots, max);
-               if (unlikely(ma_dead_node(node)))
-                       goto dead_node;
-
-               if (pivots[offset] >= mas->index) {
-                       prev_max = max;
-                       prev_min = min;
-                       max = pivots[offset];
+               prev_min = min;
+               prev_max = max;
+               if (pivots[0] >= mas->index) {
+                       offset = 0;
+                       max = pivots[0];
                        goto next;
                }
 
-               do {
+               offset = 1;
+               while (offset < end) {
+                       if (pivots[offset] >= mas->index) {
+                               max = pivots[offset];
+                               break;
+                       }
                        offset++;
-               } while ((offset < end) && (pivots[offset] < mas->index));
+               }
 
-               prev_min = min;
                min = pivots[offset - 1] + 1;
-               prev_max = max;
-               if (likely(offset < end && pivots[offset]))
-                       max = pivots[offset];
-
 next:
                slots = ma_slots(node, type);
                next = mt_slot(mas->tree, slots, offset);