From: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date: Tue, 8 Sep 2020 17:30:22 +0000 (-0400)
Subject: maple_tree: Change more to use ma_get_slots
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3ead2f4decb384a7c53c3d0e4bf372f991cf724b;p=users%2Fjedix%2Flinux-maple.git

maple_tree: Change more to use ma_get_slots

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
---

diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index c4e768ef7fcb5..b618acfb2e99c 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -1708,9 +1708,10 @@ static inline struct maple_enode *mte_node_or_none(struct maple_enode *enode)
  */
 static inline void mast_topiary(struct maple_subtree_state *mast)
 {
-	unsigned char l_slot, r_slot, slot;
+	unsigned char l_off, r_off, offset;
 	unsigned long l_index,  range_min, range_max;
 	struct maple_enode *child;
+	void **slots;
 
 	// The left node is consumed, so add to the free list.
 	l_index = mast->orig_l->index;
@@ -1718,29 +1719,34 @@ static inline void mast_topiary(struct maple_subtree_state *mast)
 	mas_node_walk(mast->orig_l, mte_node_type(mast->orig_l->node),
 		      &range_min, &range_max);
 	mast->orig_l->index = l_index;
-	l_slot = mas_offset(mast->orig_l);
-	r_slot = mas_offset(mast->orig_r);
+	l_off = mas_offset(mast->orig_l);
+	r_off = mas_offset(mast->orig_r);
 	if (mast->orig_l->node == mast->orig_r->node) {
-		for (slot = l_slot + 1; slot < r_slot; slot++)
-			mat_add(mast->destroy,
-				mas_get_slot(mast->orig_l, slot));
+		slots = ma_get_slots(mte_to_node(mast->orig_l->node),
+				     mte_node_type(mast->orig_l->node));
+		for (offset = l_off + 1; offset < r_off; offset++)
+			mat_add(mast->destroy, slots[offset]);
 		return;
 	}
 	/* mast->orig_r is different and consumed. */
 	if (mte_is_leaf(mast->orig_r->node))
 		return;
 
-	/* Now destroy l_slot + 1 -> end and 0 -> r_slot - 1 */
-	slot = l_slot + 1;
-	while (slot < mt_slot_count(mast->orig_l->node)) {
-		child = mas_get_slot(mast->orig_l, slot++);
+	/* Now destroy l_off + 1 -> end and 0 -> r_off - 1 */
+	offset = l_off + 1;
+	slots = ma_get_slots(mte_to_node(mast->orig_l->node),
+			     mte_node_type(mast->orig_l->node));
+	while (offset < mt_slot_count(mast->orig_l->node)) {
+		child = slots[offset++];
 		if (!child)
 			break;
 		mat_add(mast->destroy, child);
 	}
 
-	for (slot = 0; slot < r_slot; slot++)
-		mat_add(mast->destroy, mas_get_slot(mast->orig_r, slot));
+	slots = ma_get_slots(mte_to_node(mast->orig_r->node),
+			     mte_node_type(mast->orig_r->node));
+	for (offset = 0; offset < r_off; offset++)
+		mat_add(mast->destroy, slots[offset]);
 }
 
 static inline void mast_rebalance_next(struct maple_subtree_state *mast,
@@ -3163,11 +3169,12 @@ static inline int mas_dead_node(struct ma_state *mas, unsigned long index);
 static inline void mas_prev_node(struct ma_state *mas, unsigned long limit)
 {
 	unsigned long pivot, start_piv, min;
-	int slot = mas_offset(mas);
+	int offset = mas_offset(mas);
 	struct maple_enode *mn;
 	int level;
+	void **slots;
 
-	start_piv = mas_safe_pivot(mas, slot);
+	start_piv = mas_safe_pivot(mas, offset);
 restart_prev_node:
 	level = 0;
 	if (mte_is_root(mas->node) || mas->node == MAS_NONE)
@@ -3175,33 +3182,35 @@ restart_prev_node:
 
 	while (1) {
 
-		slot = mte_parent_slot(mas->node);
+		offset = mte_parent_slot(mas->node);
 		mas_ascend(mas);
 		level++;
 
 		if (mas_dead_node(mas, start_piv))
 			goto restart_prev_node;
 
-		if (!slot)
+		if (!offset)
 			goto ascend;
 
-		slot--;
+		offset--;
+		slots = ma_get_slots(mas_mn(mas), mte_node_type(mas->node));
 		do {
-			pivot = mas_safe_pivot(mas, slot);
+			pivot = mas_safe_pivot(mas, offset);
 
-			min = mas_safe_min(mas, slot);
+			min = mas_safe_min(mas, offset);
 			if (pivot < limit)
 				goto no_entry;
 
-			if (slot != 0 && pivot == 0)
+			if (offset != 0 && pivot == 0)
 				break;
 
-			mn = mas_get_slot(mas, slot);
+			mn = rcu_dereference_check(slots[offset],
+				lockdep_is_held(mas->tree->ma_lock));
 			if (!mn)
 				continue;
 
 			if (level == 1) {
-				mas_set_offset(mas, slot);
+				mas_set_offset(mas, offset);
 				mas->node = mn;
 				mas->max = pivot;
 				mas->min = min;
@@ -3214,8 +3223,10 @@ restart_prev_node:
 			mas->node = mn;
 			mas->max = pivot;
 			mas->min = min;
-			slot = mas_data_end(mas) + 1;
-		} while (slot-- > 0);
+			offset = mas_data_end(mas) + 1;
+			slots = ma_get_slots(mas_mn(mas),
+					     mte_node_type(mas->node));
+		} while (offset-- > 0);
 
 ascend:
 		if (mte_is_root(mas->node))
@@ -5063,18 +5074,20 @@ void mas_validate_parent_slot(struct ma_state *mas)
 	struct maple_enode *node;
 	enum maple_type p_type = mas_parent_enum(mas, mas->node);
 	unsigned char p_slot = mte_parent_slot(mas->node);
+	void **slots;
 	int i;
 
 	if (mte_is_root(mas->node))
 		return;
 
 	parent = mte_parent(mas->node);
+	slots = ma_get_slots(parent, p_type);
 	MT_BUG_ON(mas->tree, mas_mn(mas) == parent);
 
 	// Check prev/next parent slot for duplicate node entry
 
 	for (i = 0; i < mt_slots[p_type]; i++) {
-		node = ma_get_slot(parent, i, p_type, mas->tree);
+		node = slots[i];
 		if (i == p_slot) {
 			if (node != mas->node)
 				pr_err("parent %p[%u] does not have %p\n",
@@ -5091,6 +5104,7 @@ void mas_validate_parent_slot(struct ma_state *mas)
 void mas_validate_child_slot(struct ma_state *mas)
 {
 	enum maple_type type = mte_node_type(mas->node);
+	void **slots = ma_get_slots(mte_to_node(mas->node), type);
 	struct maple_enode *child;
 	unsigned char i;
 
@@ -5098,7 +5112,7 @@ void mas_validate_child_slot(struct ma_state *mas)
 		return;
 
 	for (i = 0; i < mt_slots[type]; i++) {
-		child = mte_get_slot(mas->node, i, mas->tree);
+		child = slots[i];
 		if (!child)
 			break;