Commit 0f556856 authored by Michal Hocko's avatar Michal Hocko Committed by Linus Torvalds

mm, migration: do not trigger OOM killer when migrating memory

Page migration (for memory hotplug, soft_offline_page or mbind) needs to
allocate a new memory.  This can trigger an oom killer if the target
memory is depleated.  Although quite unlikely, still possible,
especially for the memory hotplug (offlining of memoery).

Up to now we didn't really have reasonable means to back off.
__GFP_NORETRY can fail just too easily and __GFP_THISNODE sticks to a
single node and that is not suitable for all callers.

But now that we have __GFP_RETRY_MAYFAIL we should use it.  It is
preferable to fail the migration than disrupt the system by killing some
processes.

Link: http://lkml.kernel.org/r/20170623085345.11304-7-mhocko@kernel.orgSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Cc: Alex Belits <alex.belits@cavium.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Darrick J. Wong <darrick.wong@oracle.com>
Cc: David Daney <david.daney@cavium.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Mel Gorman <mgorman@suse.de>
Cc: NeilBrown <neilb@suse.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dbb32956
...@@ -34,7 +34,7 @@ extern char *migrate_reason_names[MR_TYPES]; ...@@ -34,7 +34,7 @@ extern char *migrate_reason_names[MR_TYPES];
static inline struct page *new_page_nodemask(struct page *page, static inline struct page *new_page_nodemask(struct page *page,
int preferred_nid, nodemask_t *nodemask) int preferred_nid, nodemask_t *nodemask)
{ {
gfp_t gfp_mask = GFP_USER | __GFP_MOVABLE; gfp_t gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL;
if (PageHuge(page)) if (PageHuge(page))
return alloc_huge_page_nodemask(page_hstate(compound_head(page)), return alloc_huge_page_nodemask(page_hstate(compound_head(page)),
......
...@@ -1078,7 +1078,8 @@ static struct page *new_page(struct page *page, unsigned long start, int **x) ...@@ -1078,7 +1078,8 @@ static struct page *new_page(struct page *page, unsigned long start, int **x)
/* /*
* if !vma, alloc_page_vma() will use task or system default policy * if !vma, alloc_page_vma() will use task or system default policy
*/ */
return alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, address); return alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_RETRY_MAYFAIL,
vma, address);
} }
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment