]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
maple_tree: add cp_converged() helper
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Fri, 30 Jan 2026 20:59:30 +0000 (15:59 -0500)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:52:56 +0000 (13:52 -0700)
When the maple copy node converges into a single entry, then certain
operations can stop ascending the tree.

This is used more later.

Link: https://lkml.kernel.org/r/20260130205935.2559335-26-Liam.Howlett@oracle.com
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Alice Ryhl <aliceryhl@google.com>
Cc: Andrew Ballance <andrewjballance@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Christian Kujau <lists@nerdbynature.de>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: SeongJae Park <sj@kernel.org>
Cc: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/maple_tree.c

index 86072bfc2419c7ef409b60c71aa87a18b73faed6..3e0469d365e6a18f1c1dd4233fef45594c7740f6 100644 (file)
@@ -3493,6 +3493,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
@@ -3575,10 +3585,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);