From: Liam R. Howlett <Liam.Howlett@oracle.com> Date: Tue, 6 May 2025 16:23:21 +0000 (-0400) Subject: move left_store to split_data struct X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=7c74ba21eb3519aa9ba1dc6ae2568b4ca283e8f4;p=users%2Fjedix%2Flinux-maple.git move left_store to split_data struct Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com> --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 9b7a952d9113..99081c1ee297 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -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;