From: Liam R. Howlett <Liam.Howlett@Oracle.com>
Date: Wed, 9 Sep 2020 16:01:37 +0000 (-0400)
Subject: maple_tree: rework mas_prev_node loop
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3a03957d78ab45bc6d0c692ee0efb4ba0fefa57d;p=users%2Fjedix%2Flinux-maple.git

maple_tree: rework mas_prev_node loop

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

diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 5066e5460471..f5ef8324e939 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -3166,11 +3166,14 @@ static inline void mas_prev_node(struct ma_state *mas, unsigned long limit)
 	start_piv = mas_safe_pivot(mas, offset);
 restart_prev_node:
 	level = 0;
-	if (mte_is_root(mas->node) || mas->node == MAS_NONE)
+	if (mas->node == MAS_NONE)
 		goto no_entry;
 
 	while (1) {
 
+		if (mte_is_root(mas->node))
+			goto no_entry;
+
 		offset = mte_parent_slot(mas->node);
 		mas_ascend(mas);
 		level++;
@@ -3179,7 +3182,7 @@ restart_prev_node:
 			goto restart_prev_node;
 
 		if (!offset)
-			goto ascend;
+			continue;
 
 		offset--;
 		slots = ma_get_slots(mas_mn(mas), mte_node_type(mas->node));
@@ -3190,7 +3193,7 @@ restart_prev_node:
 			if (pivot < limit)
 				goto no_entry;
 
-			if (offset != 0 && pivot == 0)
+			if (!pivot && offset) // end of node.
 				break;
 
 			mn = rcu_dereference_check(slots[offset],
@@ -3216,10 +3219,6 @@ restart_prev_node:
 			slots = ma_get_slots(mas_mn(mas),
 					     mte_node_type(mas->node));
 		} while (offset-- > 0);
-
-ascend:
-		if (mte_is_root(mas->node))
-			goto no_entry;
 	}
 
 no_entry: