Re: [RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-08 Thread Minchan Kim
On Thu, Dec 04, 2014 at 06:12:56PM +0100, Vlastimil Babka wrote:
> When __rmqueue_fallback() is called to allocate a page of order X, it will
> find a page of order Y >= X of a fallback migratetype, which is different from
> the desired migratetype. With the help of try_to_steal_freepages(), it may
> change the migratetype (to the desired one) also of:
> 
> 1) all currently free pages in the pageblock containing the fallback page
> 2) the fallback pageblock itself
> 3) buddy pages created by splitting the fallback page (when Y > X)
> 
> These decisions take the order Y into account, as well as the desired
> migratetype, with the goal of preventing multiple fallback allocations that
> could e.g. distribute UNMOVABLE allocations among multiple pageblocks.
> 
> Originally, decision for 1) has implied the decision for 3). Commit
> 47118af076f6 ("mm: mmzone: MIGRATE_CMA migration type added") changed that
> (probably unintentionally) so that the buddy pages in case 3) are always
> changed to the desired migratetype, except for CMA pageblocks.
> 
> Commit fef903efcf0c ("mm/page_allo.c: restructure free-page stealing code and
> fix a bug") did some refactoring and added a comment that the case of 3) is
> intended. Commit 0cbef29a7821 ("mm: __rmqueue_fallback() should respect
> pageblock type") removed the comment and tried to restore the original 
> behavior
> where 1) implies 3), but due to the previous refactoring, the result is 
> instead
> that only 2) implies 3) - and the conditions for 2) are less frequently met
> than conditions for 1). This may increase fragmentation in situations where 
> the
> code decides to steal all free pages from the pageblock (case 1)), but then
> gives back the buddy pages produced by splitting.
> 
> This patch restores the original intended logic where 1) implies 3). During
> testing with stress-highalloc from mmtests, this has shown to decrease the
> number of events where UNMOVABLE and RECLAIMABLE allocations steal from 
> MOVABLE
> pageblocks, which can lead to permanent fragmentation. It has increased the
> number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
> pageblocks, but these are fixable by sync compaction and thus less harmful.
> 
> Signed-off-by: Vlastimil Babka 
Acked-by: Minchan Kim 

I expect you will Cc -stable when you respin with fixing pointed out
by Joonsoo.

-- 
Kind regards,
Minchan Kim
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-08 Thread Mel Gorman
On Thu, Dec 04, 2014 at 06:12:56PM +0100, Vlastimil Babka wrote:
> When __rmqueue_fallback() is called to allocate a page of order X, it will
> find a page of order Y >= X of a fallback migratetype, which is different from
> the desired migratetype. With the help of try_to_steal_freepages(), it may
> change the migratetype (to the desired one) also of:
> 
> 1) all currently free pages in the pageblock containing the fallback page
> 2) the fallback pageblock itself
> 3) buddy pages created by splitting the fallback page (when Y > X)
> 
> These decisions take the order Y into account, as well as the desired
> migratetype, with the goal of preventing multiple fallback allocations that
> could e.g. distribute UNMOVABLE allocations among multiple pageblocks.
> 
> Originally, decision for 1) has implied the decision for 3). Commit
> 47118af076f6 ("mm: mmzone: MIGRATE_CMA migration type added") changed that
> (probably unintentionally) so that the buddy pages in case 3) are always
> changed to the desired migratetype, except for CMA pageblocks.
> 
> Commit fef903efcf0c ("mm/page_allo.c: restructure free-page stealing code and
> fix a bug") did some refactoring and added a comment that the case of 3) is
> intended. Commit 0cbef29a7821 ("mm: __rmqueue_fallback() should respect
> pageblock type") removed the comment and tried to restore the original 
> behavior
> where 1) implies 3), but due to the previous refactoring, the result is 
> instead
> that only 2) implies 3) - and the conditions for 2) are less frequently met
> than conditions for 1). This may increase fragmentation in situations where 
> the
> code decides to steal all free pages from the pageblock (case 1)), but then
> gives back the buddy pages produced by splitting.
> 
> This patch restores the original intended logic where 1) implies 3). During
> testing with stress-highalloc from mmtests, this has shown to decrease the
> number of events where UNMOVABLE and RECLAIMABLE allocations steal from 
> MOVABLE
> pageblocks, which can lead to permanent fragmentation. It has increased the
> number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
> pageblocks, but these are fixable by sync compaction and thus less harmful.
> 
> Signed-off-by: Vlastimil Babka 

Assuming the tracepoint issue Joonsoo pointed out gets corrected;

Acked-by: Mel Gorman 

I'm kicking myself that I missed the effect of 47118af076f6 when I was
reviewing it. I knew allocation success rates were worse than they used
to be but had been blaming changes in aggression of reclaim and
compaction.

-- 
Mel Gorman
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-08 Thread Mel Gorman
On Thu, Dec 04, 2014 at 06:12:56PM +0100, Vlastimil Babka wrote:
 When __rmqueue_fallback() is called to allocate a page of order X, it will
 find a page of order Y = X of a fallback migratetype, which is different from
 the desired migratetype. With the help of try_to_steal_freepages(), it may
 change the migratetype (to the desired one) also of:
 
 1) all currently free pages in the pageblock containing the fallback page
 2) the fallback pageblock itself
 3) buddy pages created by splitting the fallback page (when Y  X)
 
 These decisions take the order Y into account, as well as the desired
 migratetype, with the goal of preventing multiple fallback allocations that
 could e.g. distribute UNMOVABLE allocations among multiple pageblocks.
 
 Originally, decision for 1) has implied the decision for 3). Commit
 47118af076f6 (mm: mmzone: MIGRATE_CMA migration type added) changed that
 (probably unintentionally) so that the buddy pages in case 3) are always
 changed to the desired migratetype, except for CMA pageblocks.
 
 Commit fef903efcf0c (mm/page_allo.c: restructure free-page stealing code and
 fix a bug) did some refactoring and added a comment that the case of 3) is
 intended. Commit 0cbef29a7821 (mm: __rmqueue_fallback() should respect
 pageblock type) removed the comment and tried to restore the original 
 behavior
 where 1) implies 3), but due to the previous refactoring, the result is 
 instead
 that only 2) implies 3) - and the conditions for 2) are less frequently met
 than conditions for 1). This may increase fragmentation in situations where 
 the
 code decides to steal all free pages from the pageblock (case 1)), but then
 gives back the buddy pages produced by splitting.
 
 This patch restores the original intended logic where 1) implies 3). During
 testing with stress-highalloc from mmtests, this has shown to decrease the
 number of events where UNMOVABLE and RECLAIMABLE allocations steal from 
 MOVABLE
 pageblocks, which can lead to permanent fragmentation. It has increased the
 number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
 pageblocks, but these are fixable by sync compaction and thus less harmful.
 
 Signed-off-by: Vlastimil Babka vba...@suse.cz

Assuming the tracepoint issue Joonsoo pointed out gets corrected;

Acked-by: Mel Gorman mgor...@suse.de

I'm kicking myself that I missed the effect of 47118af076f6 when I was
reviewing it. I knew allocation success rates were worse than they used
to be but had been blaming changes in aggression of reclaim and
compaction.

-- 
Mel Gorman
SUSE Labs
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-08 Thread Minchan Kim
On Thu, Dec 04, 2014 at 06:12:56PM +0100, Vlastimil Babka wrote:
 When __rmqueue_fallback() is called to allocate a page of order X, it will
 find a page of order Y = X of a fallback migratetype, which is different from
 the desired migratetype. With the help of try_to_steal_freepages(), it may
 change the migratetype (to the desired one) also of:
 
 1) all currently free pages in the pageblock containing the fallback page
 2) the fallback pageblock itself
 3) buddy pages created by splitting the fallback page (when Y  X)
 
 These decisions take the order Y into account, as well as the desired
 migratetype, with the goal of preventing multiple fallback allocations that
 could e.g. distribute UNMOVABLE allocations among multiple pageblocks.
 
 Originally, decision for 1) has implied the decision for 3). Commit
 47118af076f6 (mm: mmzone: MIGRATE_CMA migration type added) changed that
 (probably unintentionally) so that the buddy pages in case 3) are always
 changed to the desired migratetype, except for CMA pageblocks.
 
 Commit fef903efcf0c (mm/page_allo.c: restructure free-page stealing code and
 fix a bug) did some refactoring and added a comment that the case of 3) is
 intended. Commit 0cbef29a7821 (mm: __rmqueue_fallback() should respect
 pageblock type) removed the comment and tried to restore the original 
 behavior
 where 1) implies 3), but due to the previous refactoring, the result is 
 instead
 that only 2) implies 3) - and the conditions for 2) are less frequently met
 than conditions for 1). This may increase fragmentation in situations where 
 the
 code decides to steal all free pages from the pageblock (case 1)), but then
 gives back the buddy pages produced by splitting.
 
 This patch restores the original intended logic where 1) implies 3). During
 testing with stress-highalloc from mmtests, this has shown to decrease the
 number of events where UNMOVABLE and RECLAIMABLE allocations steal from 
 MOVABLE
 pageblocks, which can lead to permanent fragmentation. It has increased the
 number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
 pageblocks, but these are fixable by sync compaction and thus less harmful.
 
 Signed-off-by: Vlastimil Babka vba...@suse.cz
Acked-by: Minchan Kim minc...@kernel.org

I expect you will Cc -stable when you respin with fixing pointed out
by Joonsoo.

-- 
Kind regards,
Minchan Kim
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-07 Thread Joonsoo Kim
On Thu, Dec 04, 2014 at 06:12:56PM +0100, Vlastimil Babka wrote:
> When __rmqueue_fallback() is called to allocate a page of order X, it will
> find a page of order Y >= X of a fallback migratetype, which is different from
> the desired migratetype. With the help of try_to_steal_freepages(), it may
> change the migratetype (to the desired one) also of:
> 
> 1) all currently free pages in the pageblock containing the fallback page
> 2) the fallback pageblock itself
> 3) buddy pages created by splitting the fallback page (when Y > X)
> 
> These decisions take the order Y into account, as well as the desired
> migratetype, with the goal of preventing multiple fallback allocations that
> could e.g. distribute UNMOVABLE allocations among multiple pageblocks.
> 
> Originally, decision for 1) has implied the decision for 3). Commit
> 47118af076f6 ("mm: mmzone: MIGRATE_CMA migration type added") changed that
> (probably unintentionally) so that the buddy pages in case 3) are always
> changed to the desired migratetype, except for CMA pageblocks.
> 
> Commit fef903efcf0c ("mm/page_allo.c: restructure free-page stealing code and
> fix a bug") did some refactoring and added a comment that the case of 3) is
> intended. Commit 0cbef29a7821 ("mm: __rmqueue_fallback() should respect
> pageblock type") removed the comment and tried to restore the original 
> behavior
> where 1) implies 3), but due to the previous refactoring, the result is 
> instead
> that only 2) implies 3) - and the conditions for 2) are less frequently met
> than conditions for 1). This may increase fragmentation in situations where 
> the
> code decides to steal all free pages from the pageblock (case 1)), but then
> gives back the buddy pages produced by splitting.
> 
> This patch restores the original intended logic where 1) implies 3). During
> testing with stress-highalloc from mmtests, this has shown to decrease the
> number of events where UNMOVABLE and RECLAIMABLE allocations steal from 
> MOVABLE
> pageblocks, which can lead to permanent fragmentation. It has increased the
> number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
> pageblocks, but these are fixable by sync compaction and thus less harmful.
> 
> Signed-off-by: Vlastimil Babka 
> ---
>  mm/page_alloc.c | 6 ++
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 616a2c9..548b072 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -1105,12 +1105,10 @@ static int try_to_steal_freepages(struct zone *zone, 
> struct page *page,
>  
>   /* Claim the whole block if over half of it is free */
>   if (pages >= (1 << (pageblock_order-1)) ||
> - page_group_by_mobility_disabled) {
> -
> + page_group_by_mobility_disabled)
>   set_pageblock_migratetype(page, start_type);
> - return start_type;
> - }
>  
> + return start_type;
>   }
>  
>   return fallback_type;

change_ownership on tracepoint will be wrong with this change.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-07 Thread Joonsoo Kim
On Thu, Dec 04, 2014 at 06:12:56PM +0100, Vlastimil Babka wrote:
 When __rmqueue_fallback() is called to allocate a page of order X, it will
 find a page of order Y = X of a fallback migratetype, which is different from
 the desired migratetype. With the help of try_to_steal_freepages(), it may
 change the migratetype (to the desired one) also of:
 
 1) all currently free pages in the pageblock containing the fallback page
 2) the fallback pageblock itself
 3) buddy pages created by splitting the fallback page (when Y  X)
 
 These decisions take the order Y into account, as well as the desired
 migratetype, with the goal of preventing multiple fallback allocations that
 could e.g. distribute UNMOVABLE allocations among multiple pageblocks.
 
 Originally, decision for 1) has implied the decision for 3). Commit
 47118af076f6 (mm: mmzone: MIGRATE_CMA migration type added) changed that
 (probably unintentionally) so that the buddy pages in case 3) are always
 changed to the desired migratetype, except for CMA pageblocks.
 
 Commit fef903efcf0c (mm/page_allo.c: restructure free-page stealing code and
 fix a bug) did some refactoring and added a comment that the case of 3) is
 intended. Commit 0cbef29a7821 (mm: __rmqueue_fallback() should respect
 pageblock type) removed the comment and tried to restore the original 
 behavior
 where 1) implies 3), but due to the previous refactoring, the result is 
 instead
 that only 2) implies 3) - and the conditions for 2) are less frequently met
 than conditions for 1). This may increase fragmentation in situations where 
 the
 code decides to steal all free pages from the pageblock (case 1)), but then
 gives back the buddy pages produced by splitting.
 
 This patch restores the original intended logic where 1) implies 3). During
 testing with stress-highalloc from mmtests, this has shown to decrease the
 number of events where UNMOVABLE and RECLAIMABLE allocations steal from 
 MOVABLE
 pageblocks, which can lead to permanent fragmentation. It has increased the
 number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
 pageblocks, but these are fixable by sync compaction and thus less harmful.
 
 Signed-off-by: Vlastimil Babka vba...@suse.cz
 ---
  mm/page_alloc.c | 6 ++
  1 file changed, 2 insertions(+), 4 deletions(-)
 
 diff --git a/mm/page_alloc.c b/mm/page_alloc.c
 index 616a2c9..548b072 100644
 --- a/mm/page_alloc.c
 +++ b/mm/page_alloc.c
 @@ -1105,12 +1105,10 @@ static int try_to_steal_freepages(struct zone *zone, 
 struct page *page,
  
   /* Claim the whole block if over half of it is free */
   if (pages = (1  (pageblock_order-1)) ||
 - page_group_by_mobility_disabled) {
 -
 + page_group_by_mobility_disabled)
   set_pageblock_migratetype(page, start_type);
 - return start_type;
 - }
  
 + return start_type;
   }
  
   return fallback_type;

change_ownership on tracepoint will be wrong with this change.

Thanks.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-04 Thread Vlastimil Babka
When __rmqueue_fallback() is called to allocate a page of order X, it will
find a page of order Y >= X of a fallback migratetype, which is different from
the desired migratetype. With the help of try_to_steal_freepages(), it may
change the migratetype (to the desired one) also of:

1) all currently free pages in the pageblock containing the fallback page
2) the fallback pageblock itself
3) buddy pages created by splitting the fallback page (when Y > X)

These decisions take the order Y into account, as well as the desired
migratetype, with the goal of preventing multiple fallback allocations that
could e.g. distribute UNMOVABLE allocations among multiple pageblocks.

Originally, decision for 1) has implied the decision for 3). Commit
47118af076f6 ("mm: mmzone: MIGRATE_CMA migration type added") changed that
(probably unintentionally) so that the buddy pages in case 3) are always
changed to the desired migratetype, except for CMA pageblocks.

Commit fef903efcf0c ("mm/page_allo.c: restructure free-page stealing code and
fix a bug") did some refactoring and added a comment that the case of 3) is
intended. Commit 0cbef29a7821 ("mm: __rmqueue_fallback() should respect
pageblock type") removed the comment and tried to restore the original behavior
where 1) implies 3), but due to the previous refactoring, the result is instead
that only 2) implies 3) - and the conditions for 2) are less frequently met
than conditions for 1). This may increase fragmentation in situations where the
code decides to steal all free pages from the pageblock (case 1)), but then
gives back the buddy pages produced by splitting.

This patch restores the original intended logic where 1) implies 3). During
testing with stress-highalloc from mmtests, this has shown to decrease the
number of events where UNMOVABLE and RECLAIMABLE allocations steal from MOVABLE
pageblocks, which can lead to permanent fragmentation. It has increased the
number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
pageblocks, but these are fixable by sync compaction and thus less harmful.

Signed-off-by: Vlastimil Babka 
---
 mm/page_alloc.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 616a2c9..548b072 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1105,12 +1105,10 @@ static int try_to_steal_freepages(struct zone *zone, 
struct page *page,
 
/* Claim the whole block if over half of it is free */
if (pages >= (1 << (pageblock_order-1)) ||
-   page_group_by_mobility_disabled) {
-
+   page_group_by_mobility_disabled)
set_pageblock_migratetype(page, start_type);
-   return start_type;
-   }
 
+   return start_type;
}
 
return fallback_type;
-- 
2.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC PATCH 1/3] mm: when stealing freepages, also take pages created by splitting buddy page

2014-12-04 Thread Vlastimil Babka
When __rmqueue_fallback() is called to allocate a page of order X, it will
find a page of order Y = X of a fallback migratetype, which is different from
the desired migratetype. With the help of try_to_steal_freepages(), it may
change the migratetype (to the desired one) also of:

1) all currently free pages in the pageblock containing the fallback page
2) the fallback pageblock itself
3) buddy pages created by splitting the fallback page (when Y  X)

These decisions take the order Y into account, as well as the desired
migratetype, with the goal of preventing multiple fallback allocations that
could e.g. distribute UNMOVABLE allocations among multiple pageblocks.

Originally, decision for 1) has implied the decision for 3). Commit
47118af076f6 (mm: mmzone: MIGRATE_CMA migration type added) changed that
(probably unintentionally) so that the buddy pages in case 3) are always
changed to the desired migratetype, except for CMA pageblocks.

Commit fef903efcf0c (mm/page_allo.c: restructure free-page stealing code and
fix a bug) did some refactoring and added a comment that the case of 3) is
intended. Commit 0cbef29a7821 (mm: __rmqueue_fallback() should respect
pageblock type) removed the comment and tried to restore the original behavior
where 1) implies 3), but due to the previous refactoring, the result is instead
that only 2) implies 3) - and the conditions for 2) are less frequently met
than conditions for 1). This may increase fragmentation in situations where the
code decides to steal all free pages from the pageblock (case 1)), but then
gives back the buddy pages produced by splitting.

This patch restores the original intended logic where 1) implies 3). During
testing with stress-highalloc from mmtests, this has shown to decrease the
number of events where UNMOVABLE and RECLAIMABLE allocations steal from MOVABLE
pageblocks, which can lead to permanent fragmentation. It has increased the
number of events when MOVABLE allocations steal from UNMOVABLE or RECLAIMABLE
pageblocks, but these are fixable by sync compaction and thus less harmful.

Signed-off-by: Vlastimil Babka vba...@suse.cz
---
 mm/page_alloc.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 616a2c9..548b072 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1105,12 +1105,10 @@ static int try_to_steal_freepages(struct zone *zone, 
struct page *page,
 
/* Claim the whole block if over half of it is free */
if (pages = (1  (pageblock_order-1)) ||
-   page_group_by_mobility_disabled) {
-
+   page_group_by_mobility_disabled)
set_pageblock_migratetype(page, start_type);
-   return start_type;
-   }
 
+   return start_type;
}
 
return fallback_type;
-- 
2.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/