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;