Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2017-10-20 13:20:45 +0200
committerJiri Kosina <jkosina@suse.cz>2017-10-20 13:20:45 +0200
commitce8476f4750d3a30e72b5ee537288a2404e7a6c1 (patch)
tree5e869923fd443c7749791c5ebfdd47bb31ea638a
parent480195331e2d75bd2482b353c18df1e946b0c723 (diff)
parent14e8830ace563234590de75a46c4ddf4cbe30061 (diff)
Merge remote-tracking branch 'origin/users/mgorman/SLE15/for-next' into SLE15
-rw-r--r--patches.suse/mm-page_alloc-simplify-list-handling-in-rmqueue_bulk.patch64
-rw-r--r--patches.suse/mm-pagevec-rename-pagevec-drained-field.patch63
-rw-r--r--series.conf2
3 files changed, 129 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/patches.suse/mm-pagevec-rename-pagevec-drained-field.patch b/patches.suse/mm-pagevec-rename-pagevec-drained-field.patch
new file mode 100644
index 0000000000..667b0c58c4
--- /dev/null
+++ b/patches.suse/mm-pagevec-rename-pagevec-drained-field.patch
@@ -0,0 +1,63 @@
+From: Mel Gorman <mgorman@techsingularity.net>
+Subject: mm, pagevec: rename pagevec drained field
+
+References: bsc#1060256
+Patch-mainline: not yet, accepted to mm tree
+Patch-name: patches.suse/mm-pagevec-rename-pagevec-drained-field.patch
+
+According to Vlastimil Babka, the drained field in pagevec is potentially
+misleading because it might be interpreted as draining this pagevec
+instead of the percpu lru pagevecs. Rename the field for clarity.
+
+Link: http://lkml.kernel.org/r/20171019093346.ylahzdpzmoriyf4v@techsingularity.net
+Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
+Suggested-by: Vlastimil Babka <vbabka@suse.cz>
+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>
+---
+
+ include/linux/pagevec.h | 4 ++--
+ mm/swap.c | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff -puN include/linux/pagevec.h~mm-pagevec-rename-pagevec-drained-field include/linux/pagevec.h
+--- a/include/linux/pagevec.h~mm-pagevec-rename-pagevec-drained-field
++++ a/include/linux/pagevec.h
+@@ -16,7 +16,7 @@ struct address_space;
+
+ struct pagevec {
+ unsigned long nr;
+- bool drained;
++ bool percpu_pvec_drained;
+ struct page *pages[PAGEVEC_SIZE];
+ };
+
+@@ -52,7 +52,7 @@ static inline unsigned pagevec_lookup_ta
+ static inline void pagevec_init(struct pagevec *pvec)
+ {
+ pvec->nr = 0;
+- pvec->drained = false;
++ pvec->percpu_pvec_drained = false;
+ }
+
+ static inline void pagevec_reinit(struct pagevec *pvec)
+diff -puN mm/swap.c~mm-pagevec-rename-pagevec-drained-field mm/swap.c
+--- a/mm/swap.c~mm-pagevec-rename-pagevec-drained-field
++++ a/mm/swap.c
+@@ -833,9 +833,9 @@ EXPORT_SYMBOL(release_pages);
+ */
+ void __pagevec_release(struct pagevec *pvec)
+ {
+- if (!pvec->drained) {
++ if (!pvec->percpu_pvec_drained) {
+ lru_add_drain();
+- pvec->drained = true;
++ pvec->percpu_pvec_drained = true;
+ }
+ release_pages(pvec->pages, pagevec_count(pvec));
+ pagevec_reinit(pvec);
diff --git a/series.conf b/series.conf
index 9a0bde0684..ff3eec1f84 100644
--- a/series.conf
+++ b/series.conf
@@ -1499,6 +1499,8 @@
patches.suse/mm-remove-cold-parameter-for-release_pages.patch
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