diff mbox series

mm, sparse: remove check with __highest_present_section_nr in for_each_present_section_nr()

Message ID 20181211035128.43256-1-richard.weiyang@gmail.com (mailing list archive)
State New, archived
Headers show
Series mm, sparse: remove check with __highest_present_section_nr in for_each_present_section_nr() | expand

Commit Message

Wei Yang Dec. 11, 2018, 3:51 a.m. UTC
A valid present section number is in [0, __highest_present_section_nr].
And the return value of next_present_section_nr() meets this
requirement. This means it is not necessary to check it with
__highest_present_section_nr again in for_each_present_section_nr().

Since we pass an unsigned long *section_nr* to
for_each_present_section_nr(), we need to cast it to int before
comparing.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
 mm/sparse.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Wei Yang Dec. 11, 2018, 5:09 a.m. UTC | #1
On Tue, Dec 11, 2018 at 11:51:28AM +0800, Wei Yang wrote:
>A valid present section number is in [0, __highest_present_section_nr].
>And the return value of next_present_section_nr() meets this
>requirement. This means it is not necessary to check it with

            ^ , if it is not (-1)

Would like to add this to be more exact.

>__highest_present_section_nr again in for_each_present_section_nr().
>
>Since we pass an unsigned long *section_nr* to
>for_each_present_section_nr(), we need to cast it to int before
>comparing.
>
>Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>---
> mm/sparse.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
>diff --git a/mm/sparse.c b/mm/sparse.c
>index a4fdbcb21514..9eaa8f98a3d2 100644
>--- a/mm/sparse.c
>+++ b/mm/sparse.c
>@@ -197,8 +197,7 @@ static inline int next_present_section_nr(int section_nr)
> }
> #define for_each_present_section_nr(start, section_nr)		\
> 	for (section_nr = next_present_section_nr(start-1);	\
>-	     ((section_nr >= 0) &&				\
>-	      (section_nr <= __highest_present_section_nr));	\
>+	     (int)section_nr >= 0;				\
> 	     section_nr = next_present_section_nr(section_nr))
> 
> static inline unsigned long first_present_section_nr(void)
>-- 
>2.15.1
Michal Hocko Dec. 11, 2018, 9:44 a.m. UTC | #2
On Tue 11-12-18 11:51:28, Wei Yang wrote:
> A valid present section number is in [0, __highest_present_section_nr].
> And the return value of next_present_section_nr() meets this
> requirement. This means it is not necessary to check it with
> __highest_present_section_nr again in for_each_present_section_nr().
> 
> Since we pass an unsigned long *section_nr* to
> for_each_present_section_nr(), we need to cast it to int before
> comparing.

Why do we want this patch? Is it an improvement? If yes, it is
performance visible change or does it make the code easier to maintain?

To me at least the later seems dubious to be honest because it adds a
non-obvious dependency of the terminal condition to the
next_present_section_nr implementation and that might turn out error
prone.

> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> ---
>  mm/sparse.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/mm/sparse.c b/mm/sparse.c
> index a4fdbcb21514..9eaa8f98a3d2 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -197,8 +197,7 @@ static inline int next_present_section_nr(int section_nr)
>  }
>  #define for_each_present_section_nr(start, section_nr)		\
>  	for (section_nr = next_present_section_nr(start-1);	\
> -	     ((section_nr >= 0) &&				\
> -	      (section_nr <= __highest_present_section_nr));	\
> +	     (int)section_nr >= 0;				\
>  	     section_nr = next_present_section_nr(section_nr))
>  
>  static inline unsigned long first_present_section_nr(void)
> -- 
> 2.15.1
>
Wei Yang Dec. 11, 2018, 10:19 a.m. UTC | #3
On Tue, Dec 11, 2018 at 10:44:41AM +0100, Michal Hocko wrote:
>On Tue 11-12-18 11:51:28, Wei Yang wrote:
>> A valid present section number is in [0, __highest_present_section_nr].
>> And the return value of next_present_section_nr() meets this
>> requirement. This means it is not necessary to check it with
>> __highest_present_section_nr again in for_each_present_section_nr().
>> 
>> Since we pass an unsigned long *section_nr* to
>> for_each_present_section_nr(), we need to cast it to int before
>> comparing.
>
>Why do we want this patch? Is it an improvement? If yes, it is
>performance visible change or does it make the code easier to maintain?
>

Michal

I know you concern, maintainance is a very critical part of review.

>To me at least the later seems dubious to be honest because it adds a
>non-obvious dependency of the terminal condition to the
>next_present_section_nr implementation and that might turn out error
>prone.
>

While I think the original code is not that clear about the syntax.

When we look at the next_present_section_nr(section_nr), the return
value falls into two categories:

  -1   : no more present section after section_nr
  other: the next present section number after section_nr

Based on this syntax, the iteration could be simpler to terminate
when the return value is less than 0. This is what the patch tries to
do.

Maybe I could do more to help the maintainance:

  * add some comment about the return value of next_present_section_nr
  * terminate the loop when section_nr == -1

Hope this would help a little.
Michal Hocko Dec. 11, 2018, 10:23 a.m. UTC | #4
On Tue 11-12-18 10:19:05, Wei Yang wrote:
> On Tue, Dec 11, 2018 at 10:44:41AM +0100, Michal Hocko wrote:
> >On Tue 11-12-18 11:51:28, Wei Yang wrote:
> >> A valid present section number is in [0, __highest_present_section_nr].
> >> And the return value of next_present_section_nr() meets this
> >> requirement. This means it is not necessary to check it with
> >> __highest_present_section_nr again in for_each_present_section_nr().
> >> 
> >> Since we pass an unsigned long *section_nr* to
> >> for_each_present_section_nr(), we need to cast it to int before
> >> comparing.
> >
> >Why do we want this patch? Is it an improvement? If yes, it is
> >performance visible change or does it make the code easier to maintain?
> >
> 
> Michal
> 
> I know you concern, maintainance is a very critical part of review.
> 
> >To me at least the later seems dubious to be honest because it adds a
> >non-obvious dependency of the terminal condition to the
> >next_present_section_nr implementation and that might turn out error
> >prone.
> >
> 
> While I think the original code is not that clear about the syntax.
> 
> When we look at the next_present_section_nr(section_nr), the return
> value falls into two categories:
> 
>   -1   : no more present section after section_nr
>   other: the next present section number after section_nr
> 
> Based on this syntax, the iteration could be simpler to terminate
> when the return value is less than 0. This is what the patch tries to
> do.
> 
> Maybe I could do more to help the maintainance:
> 
>   * add some comment about the return value of next_present_section_nr
>   * terminate the loop when section_nr == -1
> 
> Hope this would help a little.

Well, not really. Nothing of the above seems to matter to callers of the
code. So I do not see this as a general improvement and as such no
strong reason to merge it. It is basicly polishing a code without any
obvious issues.
Wei Yang Dec. 11, 2018, 2:41 p.m. UTC | #5
On Tue, Dec 11, 2018 at 11:23:13AM +0100, Michal Hocko wrote:
>On Tue 11-12-18 10:19:05, Wei Yang wrote:
>> On Tue, Dec 11, 2018 at 10:44:41AM +0100, Michal Hocko wrote:
>> >On Tue 11-12-18 11:51:28, Wei Yang wrote:
>> >> A valid present section number is in [0, __highest_present_section_nr].
>> >> And the return value of next_present_section_nr() meets this
>> >> requirement. This means it is not necessary to check it with
>> >> __highest_present_section_nr again in for_each_present_section_nr().
>> >> 
>> >> Since we pass an unsigned long *section_nr* to
>> >> for_each_present_section_nr(), we need to cast it to int before
>> >> comparing.
>> >
>> >Why do we want this patch? Is it an improvement? If yes, it is
>> >performance visible change or does it make the code easier to maintain?
>> >
>> 
>> Michal
>> 
>> I know you concern, maintainance is a very critical part of review.
>> 
>> >To me at least the later seems dubious to be honest because it adds a
>> >non-obvious dependency of the terminal condition to the
>> >next_present_section_nr implementation and that might turn out error
>> >prone.
>> >
>> 
>> While I think the original code is not that clear about the syntax.
>> 
>> When we look at the next_present_section_nr(section_nr), the return
>> value falls into two categories:
>> 
>>   -1   : no more present section after section_nr
>>   other: the next present section number after section_nr
>> 
>> Based on this syntax, the iteration could be simpler to terminate
>> when the return value is less than 0. This is what the patch tries to
>> do.
>> 
>> Maybe I could do more to help the maintainance:
>> 
>>   * add some comment about the return value of next_present_section_nr
>>   * terminate the loop when section_nr == -1
>> 
>> Hope this would help a little.
>
>Well, not really. Nothing of the above seems to matter to callers of the
>code. So I do not see this as a general improvement and as such no
>strong reason to merge it. It is basicly polishing a code without any
>obvious issues.

Er... but I don't see the reason to keep a redundant check in the code.

Even this is an internal function, it would be better to make it clean
and neat. Would you mind sharing your concern about this polishing? If
there is no issue, we would prefer no polishing of the code?

>-- 
>Michal Hocko
>SUSE Labs
diff mbox series

Patch

diff --git a/mm/sparse.c b/mm/sparse.c
index a4fdbcb21514..9eaa8f98a3d2 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -197,8 +197,7 @@  static inline int next_present_section_nr(int section_nr)
 }
 #define for_each_present_section_nr(start, section_nr)		\
 	for (section_nr = next_present_section_nr(start-1);	\
-	     ((section_nr >= 0) &&				\
-	      (section_nr <= __highest_present_section_nr));	\
+	     (int)section_nr >= 0;				\
 	     section_nr = next_present_section_nr(section_nr))
 
 static inline unsigned long first_present_section_nr(void)