]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: Add cp_converged() helper
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 14 Oct 2025 20:12:13 +0000 (16:12 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Wed, 15 Oct 2025 19:12:02 +0000 (15:12 -0400)
When the maple copy node converges into a single entry, then certain
operations can stop ascending the tree.

This is used more later.

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

index 77683a037d0e33dd31ab82f8094b3a11ed78de6b..836eafe85b74adfbe34134a5a5ec94fc9ec995cf 100644 (file)
@@ -3460,6 +3460,16 @@ static inline bool cp_is_new_root(struct maple_copy *cp, struct ma_state *mas)
        return true;
 }
 
+static inline bool cp_converged(struct maple_copy *cp, struct ma_state *mas,
+                               struct ma_state *sib)
+{
+       if (cp->d_count != 1 || sib->end)
+               return false;
+
+       cp->dst[0].node->parent = ma_parent_ptr(mas_mn(mas)->parent);
+       return true;
+}
+
 /*
  * spanning_ascend() - See if a spanning store operation has to keep walking up
  * the tree
@@ -3542,10 +3552,8 @@ static inline bool rebalance_ascend(struct maple_copy *cp,
        if (cp_is_new_root(cp, mas))
                return false;
 
-       if (cp->d_count == 1 && !sib->end) {
-               cp->dst[0].node->parent = ma_parent_ptr(mas_mn(mas)->parent);
+       if (cp_converged(cp, mas, sib))
                return false;
-       }
 
        cp->height++;
        copy_tree_location(parent, mas);