Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMel Gorman <mgorman@suse.de>2017-10-20 09:27:17 +0100
committerMel Gorman <mgorman@suse.de>2017-10-20 09:27:17 +0100
commit14e8830ace563234590de75a46c4ddf4cbe30061 (patch)
tree4377c0d4a1412993f01c1eebc2ab6a59b4732f8f
parentec03f353ced3997647175eb255af5ac9d75ce5d0 (diff)
mm, page_alloc: simplify list handling in rmqueue_bulk()
(bsc#1060256).
-rw-r--r--patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch64
-rw-r--r--series.conf1
2 files changed, 65 insertions, 0 deletions
diff --git a/patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch b/patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch
new file mode 100644
index 0000000000..88eac67f2a
--- /dev/null
+++ b/patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch
@@ -0,0 +1,64 @@
+From: Vlastimil Babka <vbabka@suse.cz>
+Subject: mm, page_alloc: simplify list handling in rmqueue_bulk()
+
+References: bsc#1060256
+Patch-mainline: not yet, accepted to mm tree
+Patch-name: patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch
+
+rmqueue_bulk() fills an empty pcplist with pages from the free list. It
+tries to preserve increasing order by pfn to the caller, because it leads
+to better performance with some I/O controllers, as explained in
+e084b2d95e48 ("page-allocator: preserve PFN ordering when __GFP_COLD is
+set").
+
+To preserve the order, it's sufficient to add pages to the tail of the
+list as they are retrieved. The current code instead adds to the head of
+the list, but then updates the list head pointer to the last added page,
+in each step. This does result in the same order, but is needlessly
+confusing and potentially wasteful, with no apparent benefit. This patch
+simplifies the code and adjusts comment accordingly.
+
+Link: http://lkml.kernel.org/r/f6505442-98a9-12e4-b2cd-0fa83874c159@suse.cz
+Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
+Acked-by: Mel Gorman <mgorman@techsingularity.net>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Dave Chinner <david@fromorbit.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Jan Kara <jack@suse.cz>
+Cc: Johannes Weiner <hannes@cmpxchg.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Mel Gorman <mgorman@suse.com>
+---
+
+ mm/page_alloc.c | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff -puN mm/page_alloc.c~mm-page_alloc-simplify-list-handling-in-rmqueue_bulk mm/page_alloc.c
+--- a/mm/page_alloc.c~mm-page_alloc-simplify-list-handling-in-rmqueue_bulk
++++ a/mm/page_alloc.c
+@@ -2330,16 +2330,16 @@ static int rmqueue_bulk(struct zone *zon
+ continue;
+
+ /*
+- * Split buddy pages returned by expand() are received here
+- * in physical page order. The page is added to the callers and
+- * list and the list head then moves forward. From the callers
+- * perspective, the linked list is ordered by page number in
+- * some conditions. This is useful for IO devices that can
+- * merge IO requests if the physical pages are ordered
+- * properly.
++ * Split buddy pages returned by expand() are received here in
++ * physical page order. The page is added to the tail of
++ * caller's list. From the callers perspective, the linked list
++ * is ordered by page number under some conditions. This is
++ * useful for IO devices that can forward direction from the
++ * head, thus also in the physical page order. This is useful
++ * for IO devices that can merge IO requests if the physical
++ * pages are ordered properly.
+ */
+- list_add(&page->lru, list);
+- list = &page->lru;
++ list_add_tail(&page->lru, list);
+ alloced++;
+ if (is_migrate_cma(get_pcppage_migratetype(page)))
+ __mod_zone_page_state(zone, NR_FREE_CMA_PAGES,
diff --git a/series.conf b/series.conf
index 8ed9924315..f503b87ea2 100644
--- a/series.conf
+++ b/series.conf
@@ -1500,6 +1500,7 @@
patches.suse/mm-remove-cold-parameter-from-free_hot_cold_page.patch
patches.suse/mm-remove-__GFP_COLD.patch
patches.suse/mm-pagevec-rename-pagevec-drained-field.patch
+ patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch
########################################################
# IPC patches