mm, oom: prevent premature OOM killer invocation for high order request
Fixes a regression in 4.7 and someone already asked for this.
This commit is contained in:
parent
5f7e2d6a98
commit
63e9d321c9
|
@ -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@decadent.org.uk> Sat, 03 Sep 2016 18:34:31 +0100
|
||||
|
||||
|
|
121
debian/patches/bugfix/all/mm-oom-prevent-premature-oom-killer-invocation-for-h.patch
vendored
Normal file
121
debian/patches/bugfix/all/mm-oom-prevent-premature-oom-killer-invocation-for-h.patch
vendored
Normal file
|
@ -0,0 +1,121 @@
|
|||
From: Michal Hocko <mhocko@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@suse.com>
|
||||
Tested-by: Olaf Hering <olaf@aepfle.de>
|
||||
Tested-by: Ralf-Peter Rohbeck <Ralf-Peter.Rohbeck@quantum.com>
|
||||
Cc: Markus Trippelsdorf <markus@trippelsdorf.de>
|
||||
Cc: Arkadiusz Miskiewicz <a.miskiewicz@gmail.com>
|
||||
Cc: Ralf-Peter Rohbeck <Ralf-Peter.Rohbeck@quantum.com>
|
||||
Cc: Jiri Slaby <jslaby@suse.com>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: Joonsoo Kim <js1304@gmail.com>
|
||||
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
|
||||
Cc: David Rientjes <rientjes@google.com>
|
||||
Cc: <stable@vger.kernel.org> [4.7.x]
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@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
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue