[linux] 01/01: mm, oom: prevent premature OOM killer invocation for high order request

debian-kernel at lists.debian.org debian-kernel at lists.debian.org
Fri Sep 9 19:50:17 UTC 2016


This is an automated email from the git hooks/post-receive script.

benh pushed a commit to branch sid
in repository linux.

commit 63e9d321c92f9da92626030a8993e54c2bf8838c
Author: Ben Hutchings <ben at decadent.org.uk>
Date:   Fri Sep 9 20:49:48 2016 +0100

    mm, oom: prevent premature OOM killer invocation for high order request
    
    Fixes a regression in 4.7 and someone already asked for this.
---
 debian/changelog                                   |   2 +
 ...ent-premature-oom-killer-invocation-for-h.patch | 121 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 3 files changed, 124 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 48fb132..5accdfd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -119,6 +119,8 @@ linux (4.7.3-1) UNRELEASED; urgency=medium
   * [amd64] Enable SIGNED_PE_FILE_VERIFICATION, KEXEC_FILE,
     KEXEC_VERIFY_SIG, KEXEC_BZIMAGE_VERIFY_SIG
   * i8042: Revert ABI break in 4.7.3
+  * mm, oom: prevent premature OOM killer invocation for high order request
+    (regression in 4.7)
 
  -- Ben Hutchings <ben at decadent.org.uk>  Sat, 03 Sep 2016 18:34:31 +0100
 
diff --git a/debian/patches/bugfix/all/mm-oom-prevent-premature-oom-killer-invocation-for-h.patch b/debian/patches/bugfix/all/mm-oom-prevent-premature-oom-killer-invocation-for-h.patch
new file mode 100644
index 0000000..85f96ad
--- /dev/null
+++ b/debian/patches/bugfix/all/mm-oom-prevent-premature-oom-killer-invocation-for-h.patch
@@ -0,0 +1,121 @@
+From: Michal Hocko <mhocko at suse.com>
+Date: Thu, 1 Sep 2016 16:14:41 -0700
+Subject: mm, oom: prevent premature OOM killer invocation for high order
+ request
+Origin: https://git.kernel.org/linus/6b4e3181d7bd5ca5ab6f45929e4a5ffa7ab4ab7f
+
+There have been several reports about pre-mature OOM killer invocation
+in 4.7 kernel when order-2 allocation request (for the kernel stack)
+invoked OOM killer even during basic workloads (light IO or even kernel
+compile on some filesystems).  In all reported cases the memory is
+fragmented and there are no order-2+ pages available.  There is usually
+a large amount of slab memory (usually dentries/inodes) and further
+debugging has shown that there are way too many unmovable blocks which
+are skipped during the compaction.  Multiple reporters have confirmed
+that the current linux-next which includes [1] and [2] helped and OOMs
+are not reproducible anymore.
+
+A simpler fix for the late rc and stable is to simply ignore the
+compaction feedback and retry as long as there is a reclaim progress and
+we are not getting OOM for order-0 pages.  We already do that for
+CONFING_COMPACTION=n so let's reuse the same code when compaction is
+enabled as well.
+
+[1] http://lkml.kernel.org/r/20160810091226.6709-1-vbabka@suse.cz
+[2] http://lkml.kernel.org/r/f7a9ea9d-bb88-bfd6-e340-3a933559305a@suse.cz
+
+Fixes: 0a0337e0d1d1 ("mm, oom: rework oom detection")
+Link: http://lkml.kernel.org/r/20160823074339.GB23577@dhcp22.suse.cz
+Signed-off-by: Michal Hocko <mhocko at suse.com>
+Tested-by: Olaf Hering <olaf at aepfle.de>
+Tested-by: Ralf-Peter Rohbeck <Ralf-Peter.Rohbeck at quantum.com>
+Cc: Markus Trippelsdorf <markus at trippelsdorf.de>
+Cc: Arkadiusz Miskiewicz <a.miskiewicz at gmail.com>
+Cc: Ralf-Peter Rohbeck <Ralf-Peter.Rohbeck at quantum.com>
+Cc: Jiri Slaby <jslaby at suse.com>
+Cc: Vlastimil Babka <vbabka at suse.cz>
+Cc: Joonsoo Kim <js1304 at gmail.com>
+Cc: Tetsuo Handa <penguin-kernel at i-love.sakura.ne.jp>
+Cc: David Rientjes <rientjes at google.com>
+Cc: <stable at vger.kernel.org>	[4.7.x]
+Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
+[bwh: Backported to 4.7: should_compact_retry() takes a parameter of type
+ enum migrate_node * instead of enum compact_priority *]
+---
+ mm/page_alloc.c | 51 ++-------------------------------------------------
+ 1 file changed, 2 insertions(+), 49 deletions(-)
+
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -3254,53 +3254,6 @@ __alloc_pages_direct_compact(gfp_t gfp_m
+ 	return NULL;
+ }
+ 
+-static inline bool
+-should_compact_retry(struct alloc_context *ac, int order, int alloc_flags,
+-		     enum compact_result compact_result, enum migrate_mode *migrate_mode,
+-		     int compaction_retries)
+-{
+-	int max_retries = MAX_COMPACT_RETRIES;
+-
+-	if (!order)
+-		return false;
+-
+-	/*
+-	 * compaction considers all the zone as desperately out of memory
+-	 * so it doesn't really make much sense to retry except when the
+-	 * failure could be caused by weak migration mode.
+-	 */
+-	if (compaction_failed(compact_result)) {
+-		if (*migrate_mode == MIGRATE_ASYNC) {
+-			*migrate_mode = MIGRATE_SYNC_LIGHT;
+-			return true;
+-		}
+-		return false;
+-	}
+-
+-	/*
+-	 * make sure the compaction wasn't deferred or didn't bail out early
+-	 * due to locks contention before we declare that we should give up.
+-	 * But do not retry if the given zonelist is not suitable for
+-	 * compaction.
+-	 */
+-	if (compaction_withdrawn(compact_result))
+-		return compaction_zonelist_suitable(ac, order, alloc_flags);
+-
+-	/*
+-	 * !costly requests are much more important than __GFP_REPEAT
+-	 * costly ones because they are de facto nofail and invoke OOM
+-	 * killer to move on while costly can fail and users are ready
+-	 * to cope with that. 1/4 retries is rather arbitrary but we
+-	 * would need much more detailed feedback from compaction to
+-	 * make a better decision.
+-	 */
+-	if (order > PAGE_ALLOC_COSTLY_ORDER)
+-		max_retries /= 4;
+-	if (compaction_retries <= max_retries)
+-		return true;
+-
+-	return false;
+-}
+ #else
+ static inline struct page *
+ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
+@@ -3311,6 +3264,8 @@ __alloc_pages_direct_compact(gfp_t gfp_m
+ 	return NULL;
+ }
+ 
++#endif /* CONFIG_COMPACTION */
++
+ static inline bool
+ should_compact_retry(struct alloc_context *ac, unsigned int order, int alloc_flags,
+ 		     enum compact_result compact_result,
+@@ -3337,7 +3292,6 @@ should_compact_retry(struct alloc_contex
+ 	}
+ 	return false;
+ }
+-#endif /* CONFIG_COMPACTION */
+ 
+ /* Perform direct synchronous page reclaim */
+ static int
diff --git a/debian/patches/series b/debian/patches/series
index d1ef409..402c536 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -73,6 +73,7 @@ bugfix/all/kbuild-use-nostdinc-in-compile-tests.patch
 bugfix/all/disable-some-marvell-phys.patch
 bugfix/all/fs-add-module_softdep-declarations-for-hard-coded-cr.patch
 bugfix/all/kbuild-do-not-use-hyphen-in-exported-variable-name.patch
+bugfix/all/mm-oom-prevent-premature-oom-killer-invocation-for-h.patch
 
 # Miscellaneous features
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/kernel/linux.git



More information about the Kernel-svn-changes mailing list