]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
move left_store to split_data struct
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 6 May 2025 16:23:21 +0000 (12:23 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Tue, 6 May 2025 16:23:21 +0000 (12:23 -0400)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
lib/maple_tree.c

index 9b7a952d91136ab256c84be522fedb8d7d8a1996..99081c1ee297ccca80f7c7d6d812e68a94a9964d 100644 (file)
@@ -3387,6 +3387,7 @@ struct split_data {
        unsigned char len;      /* Number of ma_node_states in the states array */
        struct ma_node_state states[5];
        bool is_alloc;
+       bool left_store;
 };
 
 /*
@@ -3809,6 +3810,7 @@ bool can_rebalance_right(struct ma_state *tmp_mas, struct ma_node_info *parent,
                return false;
        }
 
+       sd->left_store = true;
        return true;
 }
 
@@ -3831,6 +3833,7 @@ bool can_rebalance_left(struct ma_state *tmp_mas, struct ma_node_info *parent,
        }
 
        parent->insert_off--;
+       sd->left_store = false;
        return true;
 }
 /*
@@ -3875,9 +3878,9 @@ bool mas_wr_try_rebalance(struct ma_state *mas, struct ma_node_info *src,
                mns_mni_init(&sd->states[sd->len], left, 0, src2.end + 1);
                sd->len++;
        } else if (can_rebalance_right(&tmp_mas, &parent, &src2, sd)) {
+               /* Left will be src, right will be src2 */
                sd->split = src2.end + sd->new_end - sd->split;
                left_store = true;
-               /* Left will be src, right will be src2 */
                left->min = src->min;
                right->max = src2.max;
                sd->insert = mas->offset;
@@ -3921,14 +3924,13 @@ bool mas_wr_try_rebalance(struct ma_state *mas, struct ma_node_info *src,
  */
 static void rebalance_two(struct ma_node_info *left, struct ma_node_info *right,
                struct ma_node_info *src, struct ma_node_info *src2,
-               struct ma_node_part *part, struct split_data *sd,
-               bool left_store)
+               struct ma_node_part *part, struct split_data *sd)
 {
        struct ma_node_info *dst;
        struct ma_node_state *state;
 
        sd->insert_end = sd->insert + part->size - 1;
-       if (!left_store) {
+       if (!sd->left_store) {
                char len;
 
                /*
@@ -3968,7 +3970,7 @@ static void rebalance_two(struct ma_node_info *left, struct ma_node_info *right,
                sd->len++;
        } while (src->offset <= src->end);
 
-       if (left_store) {
+       if (sd->left_store) {
                char len;
 
                state = &sd->states[sd->len];
@@ -3998,13 +4000,15 @@ static void rebalance_two(struct ma_node_info *left, struct ma_node_info *right,
        part->skip = 2;
 }
 
-static void rebalance_reduce( struct ma_node_info *left,
+/*
+ * rebalance_reduce() - Reduce two nodes into one during a rebalance
+ */
+static void rebalance_reduce(struct ma_node_info *left,
                struct ma_node_info *src, struct ma_node_info *src2,
-               struct ma_node_part *part, struct split_data *sd,
-               bool left_store)
+               struct ma_node_part *part, struct split_data *sd)
 {
        sd->insert_end = sd->insert + part->size - 1;
-       if (!left_store) {
+       if (!sd->left_store) {
                left->min = src2->min;
                left->max = src->max;
                sd->offset = src2->end + 1;
@@ -4026,7 +4030,7 @@ static void rebalance_reduce( struct ma_node_info *left,
                sd->len++;
        } while (src->offset <= src->end);
 
-       if (left_store) {
+       if (sd->left_store) {
                sd->states[sd->len].info = src2;
                mns_mni_init(&sd->states[sd->len], left, 0, src2->end + 1);
                sd->len++;
@@ -4047,7 +4051,6 @@ static void mas_wr_rebalance(struct ma_wr_state *wr_mas)
        struct split_data sd;
        struct ma_node_part part;
        unsigned char height;
-       bool left_store = false;
 
        mas = wr_mas->mas;
        trace_ma_op(__func__, mas);
@@ -4079,11 +4082,10 @@ static void mas_wr_rebalance(struct ma_wr_state *wr_mas)
                if (can_rebalance_right(&tmp_mas, &parent, &src2, &sd)) {
                        /* Left will be src, right will be src2 */
                        sd.insert = mas->offset;
-                       left_store = true;
                } else {
-                       /* Won't fail here */
-                       MAS_BUG_ON(mas, can_rebalance_left(&tmp_mas, &parent, &src2, &sd) == false);
                        /* Left will be src2, right will be src */
+                       MAS_BUG_ON(mas, can_rebalance_left(&tmp_mas, &parent,
+                                                       &src2, &sd) == false);
                        sd.insert = mas->offset + src2.end + 1;
                }
 
@@ -4093,11 +4095,11 @@ static void mas_wr_rebalance(struct ma_wr_state *wr_mas)
                mas->offset = parent.insert_off;
                if (sd.new_end >= mt_slots[left.type]) {
                        mni_node_init(&right, mas_pop_node(mas), left.type);
-                       rebalance_two(&left, &right, &src, &src2, &part, &sd, left_store);
+                       rebalance_two(&left, &right, &src, &src2, &part, &sd);
                        break;
                }
 
-               rebalance_reduce(&left, &src, &src2, &part, &sd, left_store);
+               rebalance_reduce(&left, &src, &src2, &part, &sd);
                if (ma_is_root(parent.node)) {
                        if (parent.end != 1)
                                break;
@@ -4110,9 +4112,12 @@ static void mas_wr_rebalance(struct ma_wr_state *wr_mas)
                        goto new_root;
                }
 
-
                sd.new_end = mas->end + part.size - part.skip + 1;
-               if (sd.new_end > mt_min_slots[parent.type])
+               if (sd.new_end != mas->end) {
+                       printk("end is %u part %u skip %u\n", mas->end, part.size, part.skip);
+                       BUG_ON(1);
+               }
+               if (mas->end > mt_min_slots[parent.type])
                        break;
 
                sd.len = 0;