Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1671570 > unrolled thread

Re: [PATCH] mm: remove a redundant condition in the for loop

Started byMichal Hocko <mhocko@kernel.org>
First post2017-06-21 11:50 +0200
Last post2017-06-24 15:30 +0200
Articles 5 — 4 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH] mm: remove a redundant condition in the for loop Michal Hocko <mhocko@kernel.org> - 2017-06-21 11:50 +0200
    [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback Rasmus Villemoes <linux@rasmusvillemoes.dk> - 2017-06-21 21:00 +0200
      Re: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in  __rmqueue_fallback Michal Hocko <mhocko@kernel.org> - 2017-06-23 14:30 +0200
      Re: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in  __rmqueue_fallback Vlastimil Babka <vbabka@suse.cz> - 2017-06-23 15:20 +0200
      Re: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in  __rmqueue_fallback Wei Yang <richard.weiyang@gmail.com> - 2017-06-24 15:30 +0200

#1671570 — Re: [PATCH] mm: remove a redundant condition in the for loop

FromMichal Hocko <mhocko@kernel.org>
Date2017-06-21 11:50 +0200
SubjectRe: [PATCH] mm: remove a redundant condition in the for loop
Message-ID<tUKqS-4oF-19@gated-at.bofh.it>
On Mon 19-06-17 21:05:29, Rasmus Villemoes wrote:
> On Mon, Jun 19 2017, Vlastimil Babka <vbabka@suse.cz> wrote:
> 
> > On 06/19/2017 03:54 PM, Hao Lee wrote:
> >> The variable current_order decreases from MAX_ORDER-1 to order, so the
> >> condition current_order <= MAX_ORDER-1 is always true.
> >> 
> >> Signed-off-by: Hao Lee <haolee.swjtu@gmail.com>
> >
> > Sounds right.
> >
> > Acked-by: Vlastimil Babka <vbabka@suse.cz>
> 
> current_order and order are both unsigned, and if order==0,
> current_order >= order is always true, and we may decrement
> current_order past 0 making it UINT_MAX... A comment would be in order,
> though.

Yes, not the first time this has been brought up
https://lkml.org/lkml/2016/6/20/493. I guess a comment is long overdue.
Or just get rid of the unsigned trap which would be probably more clean.
 
> >> ---
> >>  mm/page_alloc.c | 5 ++---
> >>  1 file changed, 2 insertions(+), 3 deletions(-)
> >> 
> >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> >> index 2302f25..9120c2b 100644
> >> --- a/mm/page_alloc.c
> >> +++ b/mm/page_alloc.c
> >> @@ -2215,9 +2215,8 @@ __rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype)
> >>  	bool can_steal;
> >>  
> >>  	/* Find the largest possible block of pages in the other list */
> >> -	for (current_order = MAX_ORDER-1;
> >> -				current_order >= order && current_order <= MAX_ORDER-1;
> >> -				--current_order) {
> >> +	for (current_order = MAX_ORDER-1; current_order >= order;
> >> +							--current_order) {
> >>  		area = &(zone->free_area[current_order]);
> >>  		fallback_mt = find_suitable_fallback(area, current_order,
> >>  				start_migratetype, false, &can_steal);
> >> 

-- 
Michal Hocko
SUSE Labs

[toc] | [next] | [standalone]


#1671949 — [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback

FromRasmus Villemoes <linux@rasmusvillemoes.dk>
Date2017-06-21 21:00 +0200
Subject[PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback
Message-ID<tUT18-1FF-19@gated-at.bofh.it>
In reply to#1671570
Since current_order starts as MAX_ORDER-1 and is then only
decremented, the second half of the loop condition seems
superfluous. However, if order is 0, we may decrement current_order
past 0, making it UINT_MAX. This is obviously too subtle ([1], [2]).

Since we need to add some comment anyway, change the two variables to
signed, making the counting-down for loop look more familiar, and
apparently also making gcc generate slightly smaller code.

[1] https://lkml.org/lkml/2016/6/20/493
[2] https://lkml.org/lkml/2017/6/19/345

Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
---
Michal, something like this, perhaps?

mm/page_alloc.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 2302f250d6b1..e656f4da9772 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2204,19 +2204,23 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
  * list of requested migratetype, possibly along with other pages from the same
  * block, depending on fragmentation avoidance heuristics. Returns true if
  * fallback was found so that __rmqueue_smallest() can grab it.
+ *
+ * The use of signed ints for order and current_order is a deliberate
+ * deviation from the rest of this file, to make the for loop
+ * condition simpler.
  */
 static inline bool
-__rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype)
+__rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
 {
 	struct free_area *area;
-	unsigned int current_order;
+	int current_order;
 	struct page *page;
 	int fallback_mt;
 	bool can_steal;
 
 	/* Find the largest possible block of pages in the other list */
 	for (current_order = MAX_ORDER-1;
-				current_order >= order && current_order <= MAX_ORDER-1;
+				current_order >= order;
 				--current_order) {
 		area = &(zone->free_area[current_order]);
 		fallback_mt = find_suitable_fallback(area, current_order,
-- 
2.11.0

[toc] | [prev] | [next] | [standalone]


#1673506 — Re: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback

FromMichal Hocko <mhocko@kernel.org>
Date2017-06-23 14:30 +0200
SubjectRe: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback
Message-ID<tVvSN-24F-11@gated-at.bofh.it>
In reply to#1671949
On Wed 21-06-17 20:55:28, Rasmus Villemoes wrote:
> Since current_order starts as MAX_ORDER-1 and is then only
> decremented, the second half of the loop condition seems
> superfluous. However, if order is 0, we may decrement current_order
> past 0, making it UINT_MAX. This is obviously too subtle ([1], [2]).
> 
> Since we need to add some comment anyway, change the two variables to
> signed, making the counting-down for loop look more familiar, and
> apparently also making gcc generate slightly smaller code.
> 
> [1] https://lkml.org/lkml/2016/6/20/493
> [2] https://lkml.org/lkml/2017/6/19/345
> 
> Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>

I would hope for a more consistent usage of the type but his alone
should prevent future attempts to "clean up" the code.

Acked-by: Michal Hocko <mhocko@suse.com>

> ---
> Michal, something like this, perhaps?
> 
> mm/page_alloc.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 2302f250d6b1..e656f4da9772 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2204,19 +2204,23 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
>   * list of requested migratetype, possibly along with other pages from the same
>   * block, depending on fragmentation avoidance heuristics. Returns true if
>   * fallback was found so that __rmqueue_smallest() can grab it.
> + *
> + * The use of signed ints for order and current_order is a deliberate
> + * deviation from the rest of this file, to make the for loop
> + * condition simpler.
>   */
>  static inline bool
> -__rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype)
> +__rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
>  {
>  	struct free_area *area;
> -	unsigned int current_order;
> +	int current_order;
>  	struct page *page;
>  	int fallback_mt;
>  	bool can_steal;
>  
>  	/* Find the largest possible block of pages in the other list */
>  	for (current_order = MAX_ORDER-1;
> -				current_order >= order && current_order <= MAX_ORDER-1;
> +				current_order >= order;
>  				--current_order) {
>  		area = &(zone->free_area[current_order]);
>  		fallback_mt = find_suitable_fallback(area, current_order,
> -- 
> 2.11.0
> 

-- 
Michal Hocko
SUSE Labs

[toc] | [prev] | [next] | [standalone]


#1673548 — Re: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback

FromVlastimil Babka <vbabka@suse.cz>
Date2017-06-23 15:20 +0200
SubjectRe: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback
Message-ID<tVwFb-2Eg-9@gated-at.bofh.it>
In reply to#1671949
On 06/21/2017 08:55 PM, Rasmus Villemoes wrote:
> Since current_order starts as MAX_ORDER-1 and is then only
> decremented, the second half of the loop condition seems
> superfluous. However, if order is 0, we may decrement current_order
> past 0, making it UINT_MAX. This is obviously too subtle ([1], [2]).
> 
> Since we need to add some comment anyway, change the two variables to
> signed, making the counting-down for loop look more familiar, and
> apparently also making gcc generate slightly smaller code.
> 
> [1] https://lkml.org/lkml/2016/6/20/493
> [2] https://lkml.org/lkml/2017/6/19/345
> 
> Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>

Acked-by: Vlastimil Babka <vbabka@suse.cz>

> ---
> Michal, something like this, perhaps?
> 
> mm/page_alloc.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 2302f250d6b1..e656f4da9772 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2204,19 +2204,23 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
>   * list of requested migratetype, possibly along with other pages from the same
>   * block, depending on fragmentation avoidance heuristics. Returns true if
>   * fallback was found so that __rmqueue_smallest() can grab it.
> + *
> + * The use of signed ints for order and current_order is a deliberate
> + * deviation from the rest of this file, to make the for loop
> + * condition simpler.
>   */
>  static inline bool
> -__rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype)
> +__rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
>  {
>  	struct free_area *area;
> -	unsigned int current_order;
> +	int current_order;
>  	struct page *page;
>  	int fallback_mt;
>  	bool can_steal;
>  
>  	/* Find the largest possible block of pages in the other list */
>  	for (current_order = MAX_ORDER-1;
> -				current_order >= order && current_order <= MAX_ORDER-1;
> +				current_order >= order;
>  				--current_order) {
>  		area = &(zone->free_area[current_order]);
>  		fallback_mt = find_suitable_fallback(area, current_order,
> 

[toc] | [prev] | [next] | [standalone]


#1674080 — Re: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback

FromWei Yang <richard.weiyang@gmail.com>
Date2017-06-24 15:30 +0200
SubjectRe: [PATCH] mm/page_alloc.c: eliminate unsigned confusion in __rmqueue_fallback
Message-ID<tVTip-8kY-1@gated-at.bofh.it>
In reply to#1671949

[Multipart message — attachments visible in raw view] — view raw

On Wed, Jun 21, 2017 at 08:55:28PM +0200, Rasmus Villemoes wrote:
>Since current_order starts as MAX_ORDER-1 and is then only
>decremented, the second half of the loop condition seems
>superfluous. However, if order is 0, we may decrement current_order
>past 0, making it UINT_MAX. This is obviously too subtle ([1], [2]).
>
>Since we need to add some comment anyway, change the two variables to
>signed, making the counting-down for loop look more familiar, and
>apparently also making gcc generate slightly smaller code.
>
>[1] https://lkml.org/lkml/2016/6/20/493
>[2] https://lkml.org/lkml/2017/6/19/345
>
>Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
>---
>Michal, something like this, perhaps?
>
>mm/page_alloc.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
>diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>index 2302f250d6b1..e656f4da9772 100644
>--- a/mm/page_alloc.c
>+++ b/mm/page_alloc.c
>@@ -2204,19 +2204,23 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac,
>  * list of requested migratetype, possibly along with other pages from the same
>  * block, depending on fragmentation avoidance heuristics. Returns true if
>  * fallback was found so that __rmqueue_smallest() can grab it.
>+ *
>+ * The use of signed ints for order and current_order is a deliberate
>+ * deviation from the rest of this file, to make the for loop
>+ * condition simpler.
>  */
> static inline bool
>-__rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype)
>+__rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
> {
> 	struct free_area *area;
>-	unsigned int current_order;
>+	int current_order;
> 	struct page *page;
> 	int fallback_mt;
> 	bool can_steal;
> 
> 	/* Find the largest possible block of pages in the other list */
> 	for (current_order = MAX_ORDER-1;
>-				current_order >= order && current_order <= MAX_ORDER-1;
>+				current_order >= order;
> 				--current_order) {
> 		area = &(zone->free_area[current_order]);
> 		fallback_mt = find_suitable_fallback(area, current_order,
>-- 
>2.11.0

Looks nice. Why I didn't come up with this change.

Acked-by: Wei Yang <weiyang@gmail.com>

-- 
Wei Yang
Help you, Help me

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web