diff mbox series

maple_tree: remove conditionals to detect wr_node_store

Message ID 20241009152007.2096-1-sidhartha.kumar@oracle.com (mailing list archive)
State New
Headers show
Series maple_tree: remove conditionals to detect wr_node_store | expand

Commit Message

Sid Kumar Oct. 9, 2024, 3:20 p.m. UTC
From: Sidhartha <sidhartha.kumar@oracle.com>

In mas_wr_store_type(), we check if new_end < mt_slots[wr_mas->type]. If
this check fails, we know that ,after this, new_end is >= mt_min_slots.
Checking this again when we detect a wr_node_store later in the function
is reduntant. Because this check is part of an OR statement, the statement
will always evaluate to true, therefore we can just get rid of it.

Suggested-by; Wei Yang <richard.weiyang@gmail.com>
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 lib/maple_tree.c | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

Comments

Liam R. Howlett Oct. 10, 2024, 12:02 a.m. UTC | #1
* Sidhartha Kumar <sidhartha.kumar@oracle.com> [241009 11:20]:
> From: Sidhartha <sidhartha.kumar@oracle.com>
> 
> In mas_wr_store_type(), we check if new_end < mt_slots[wr_mas->type]. If
> this check fails, we know that ,after this, new_end is >= mt_min_slots.
> Checking this again when we detect a wr_node_store later in the function
> is reduntant. Because this check is part of an OR statement, the statement
> will always evaluate to true, therefore we can just get rid of it.
> 
> Suggested-by; Wei Yang <richard.weiyang@gmail.com>
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  lib/maple_tree.c | 9 +--------
>  1 file changed, 1 insertion(+), 8 deletions(-)
> 
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index 4b423330d83c..f5a12d37b352 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -4252,14 +4252,7 @@ static inline void mas_wr_store_type(struct ma_wr_state *wr_mas)
>  		return;
>  	}
>  
> -	if (mte_is_root(mas->node) || (new_end >= mt_min_slots[wr_mas->type]) ||
> -		(mas->mas_flags & MA_STATE_BULK)) {

Although this will be evaluated as true due to the new_end having at
least the minimum data, it points out that MA_STATE_BULK is not being
evaluated correctly in the new_end < min case.

That is, we will rebalance if we are in MA_STATE_BULK mode without
meeting the sufficient data mark - which is not correct.

> -		mas->store_type = wr_node_store;
> -		return;
> -	}
> -
> -	mas->store_type = wr_invalid;
> -	MAS_WARN_ON(mas, 1);
> +	mas->store_type = wr_node_store;
>  }
>  
>  /**
> -- 
> 2.43.0
>
Liam R. Howlett Oct. 10, 2024, 1:29 a.m. UTC | #2
* Liam R. Howlett <Liam.Howlett@oracle.com> [241009 20:02]:
> * Sidhartha Kumar <sidhartha.kumar@oracle.com> [241009 11:20]:
> > From: Sidhartha <sidhartha.kumar@oracle.com>
> > 
> > In mas_wr_store_type(), we check if new_end < mt_slots[wr_mas->type]. If
> > this check fails, we know that ,after this, new_end is >= mt_min_slots.
> > Checking this again when we detect a wr_node_store later in the function
> > is reduntant. Because this check is part of an OR statement, the statement
> > will always evaluate to true, therefore we can just get rid of it.
> > 
> > Suggested-by; Wei Yang <richard.weiyang@gmail.com>
> > Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> > ---
> >  lib/maple_tree.c | 9 +--------
> >  1 file changed, 1 insertion(+), 8 deletions(-)
> > 
> > diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> > index 4b423330d83c..f5a12d37b352 100644
> > --- a/lib/maple_tree.c
> > +++ b/lib/maple_tree.c
> > @@ -4252,14 +4252,7 @@ static inline void mas_wr_store_type(struct ma_wr_state *wr_mas)
> >  		return;
> >  	}
> >  
> > -	if (mte_is_root(mas->node) || (new_end >= mt_min_slots[wr_mas->type]) ||
> > -		(mas->mas_flags & MA_STATE_BULK)) {
> 
> Although this will be evaluated as true due to the new_end having at
> least the minimum data, it points out that MA_STATE_BULK is not being
> evaluated correctly in the new_end < min case.
> 
> That is, we will rebalance if we are in MA_STATE_BULK mode without
> meeting the sufficient data mark - which is not correct.

Reading through this function, it would be much cleaner to return the
enum from the function and assign it in the caller.

> 
> > -		mas->store_type = wr_node_store;
> > -		return;
> > -	}
> > -
> > -	mas->store_type = wr_invalid;
> > -	MAS_WARN_ON(mas, 1);
> > +	mas->store_type = wr_node_store;
> >  }
> >  
> >  /**
> > -- 
> > 2.43.0
> > 
> 
> -- 
> maple-tree mailing list
> maple-tree@lists.infradead.org
> https://lists.infradead.org/mailman/listinfo/maple-tree
Wei Yang Oct. 10, 2024, 6:28 a.m. UTC | #3
On Wed, Oct 09, 2024 at 11:20:07AM -0400, Sidhartha Kumar wrote:
>From: Sidhartha <sidhartha.kumar@oracle.com>
>
>In mas_wr_store_type(), we check if new_end < mt_slots[wr_mas->type]. If
>this check fails, we know that ,after this, new_end is >= mt_min_slots.
>Checking this again when we detect a wr_node_store later in the function
>is reduntant. Because this check is part of an OR statement, the statement
>will always evaluate to true, therefore we can just get rid of it.
>
>Suggested-by; Wei Yang <richard.weiyang@gmail.com>
>Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
>---
> lib/maple_tree.c | 9 +--------
> 1 file changed, 1 insertion(+), 8 deletions(-)
>
>diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>index 4b423330d83c..f5a12d37b352 100644
>--- a/lib/maple_tree.c
>+++ b/lib/maple_tree.c
>@@ -4252,14 +4252,7 @@ static inline void mas_wr_store_type(struct ma_wr_state *wr_mas)
> 		return;
> 	}
> 
>-	if (mte_is_root(mas->node) || (new_end >= mt_min_slots[wr_mas->type]) ||
>-		(mas->mas_flags & MA_STATE_BULK)) {
>-		mas->store_type = wr_node_store;
>-		return;
>-	}
>-
>-	mas->store_type = wr_invalid;
>-	MAS_WARN_ON(mas, 1);

If my understanding is correct, here is the only place we assign wr_invalid.

So maybe we can remove this definition?

>+	mas->store_type = wr_node_store;
> }
> 
> /**
>-- 
>2.43.0
Liam R. Howlett Oct. 10, 2024, 5:16 p.m. UTC | #4
* Wei Yang <richard.weiyang@gmail.com> [241010 02:28]:
> On Wed, Oct 09, 2024 at 11:20:07AM -0400, Sidhartha Kumar wrote:
> >From: Sidhartha <sidhartha.kumar@oracle.com>
> >
> >In mas_wr_store_type(), we check if new_end < mt_slots[wr_mas->type]. If
> >this check fails, we know that ,after this, new_end is >= mt_min_slots.
> >Checking this again when we detect a wr_node_store later in the function
> >is reduntant. Because this check is part of an OR statement, the statement
> >will always evaluate to true, therefore we can just get rid of it.
> >
> >Suggested-by; Wei Yang <richard.weiyang@gmail.com>
> >Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> >---
> > lib/maple_tree.c | 9 +--------
> > 1 file changed, 1 insertion(+), 8 deletions(-)
> >
> >diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> >index 4b423330d83c..f5a12d37b352 100644
> >--- a/lib/maple_tree.c
> >+++ b/lib/maple_tree.c
> >@@ -4252,14 +4252,7 @@ static inline void mas_wr_store_type(struct ma_wr_state *wr_mas)
> > 		return;
> > 	}
> > 
> >-	if (mte_is_root(mas->node) || (new_end >= mt_min_slots[wr_mas->type]) ||
> >-		(mas->mas_flags & MA_STATE_BULK)) {
> >-		mas->store_type = wr_node_store;
> >-		return;
> >-	}
> >-
> >-	mas->store_type = wr_invalid;
> >-	MAS_WARN_ON(mas, 1);
> 
> If my understanding is correct, here is the only place we assign wr_invalid.
> 
> So maybe we can remove this definition?

No.  This needs to exist to catch incorrect uses of the API, at the very
least.  I am not pleased that we aren't able to fall through to setting
this to catch missed settings with this code today.

We are now just assuming we got things right.  Any mistakes will show up
as an out-of-memory issues with writes to the tree.  It will be much
harder to track down what went wrong.

Currently it is set in the header as the default store type and should
remain for that use, at the very least.

> 
> >+	mas->store_type = wr_node_store;
> > }
> > 
> > /**
> >-- 
> >2.43.0
> 
> -- 
> Wei Yang
> Help you, Help me
diff mbox series

Patch

diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 4b423330d83c..f5a12d37b352 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -4252,14 +4252,7 @@  static inline void mas_wr_store_type(struct ma_wr_state *wr_mas)
 		return;
 	}
 
-	if (mte_is_root(mas->node) || (new_end >= mt_min_slots[wr_mas->type]) ||
-		(mas->mas_flags & MA_STATE_BULK)) {
-		mas->store_type = wr_node_store;
-		return;
-	}
-
-	mas->store_type = wr_invalid;
-	MAS_WARN_ON(mas, 1);
+	mas->store_type = wr_node_store;
 }
 
 /**