]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: inline mas_spanning_rebalance() into mas_wr_spanning_rebalance()
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 19 Aug 2025 14:11:39 +0000 (10:11 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 19 Aug 2025 14:11:39 +0000 (10:11 -0400)
Copy the contents of mas_spanning_rebalance() into
mas_wr_spanning_rebalance(), in preparation of removing initial big node
use.

No functional changes intended.

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

index 213fd5fdc44d4f50794878c230e9d29d11319286..992df6a12d8ced3dced3b031aa9579f2686db5dd 100644 (file)
@@ -2972,6 +2972,9 @@ static noinline void mas_wr_spanning_rebalance(struct ma_state *mas,
                struct ma_wr_state *l_wr_mas)
 {
        struct maple_big_node b_node;
+       MA_STATE(l_mas, mas->tree, mas->index, mas->index);
+       MA_STATE(r_mas, mas->tree, mas->index, mas->last);
+       MA_STATE(m_mas, mas->tree, mas->index, mas->index);
 
        memset(&b_node, 0, sizeof(struct maple_big_node));
        /* Copy l_mas and store the value in b_node. */
@@ -2988,7 +2991,22 @@ static noinline void mas_wr_spanning_rebalance(struct ma_state *mas,
 
        mast->bn = &b_node;
        /* Combine l_mas and r_mas and split them up evenly again. */
-       return mas_spanning_rebalance(mas, mast, height);
+
+       /*
+        * The tree needs to be rebalanced and leaves need to be kept at the same level.
+        * Rebalancing is done by use of the ``struct maple_topiary``.
+        */
+       mast->l = &l_mas;
+       mast->m = &m_mas;
+       mast->r = &r_mas;
+       l_mas.status = r_mas.status = m_mas.status = ma_none;
+
+       /* Check if this is not root and has sufficient data.  */
+       if (((mast->orig_l->min != 0) || (mast->orig_r->max != ULONG_MAX)) &&
+           unlikely(mast->bn->b_end <= mt_min_slots[mast->bn->type]))
+               mast_spanning_rebalance(mast);
+
+       mas_spanning_rebalance_loop(mas, mast, height);
 }
 /*
  * mas_rebalance() - Rebalance a given node.