[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