summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlastimil Babka <vbabka@suse.cz>2016-10-08 00:00:34 (GMT)
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-08 01:46:29 (GMT)
commitc2033b00dbe856909fcaccf038e4e0d3dcfb85af (patch)
tree866c7d2177b8547188ecde9879e687d2e98ad5ab
parentd943649831aba0fcdda37a0e9e25b332a634cf5e (diff)
downloadlinux-c2033b00dbe856909fcaccf038e4e0d3dcfb85af.tar.xz
mm, compaction: restrict full priority to non-costly orders
The new ultimate compaction priority disables some heuristics, which may result in excessive cost. This is fine for non-costly orders where we want to try hard before resulting for OOM, but might be disruptive for costly orders which do not trigger OOM and should generally have some fallback. Thus, we disable the full priority for costly orders. Suggested-by: Michal Hocko <mhocko@kernel.org> Link: http://lkml.kernel.org/r/20160906135258.18335-4-vbabka@suse.cz Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Cc: Michal Hocko <mhocko@kernel.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: David Rientjes <rientjes@google.com> Cc: Rik van Riel <riel@redhat.com> Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/compaction.h1
-rw-r--r--mm/page_alloc.c5
2 files changed, 5 insertions, 1 deletions
diff --git a/include/linux/compaction.h b/include/linux/compaction.h
index 585d55c..0d84158 100644
--- a/include/linux/compaction.h
+++ b/include/linux/compaction.h
@@ -9,6 +9,7 @@ enum compact_priority {
COMPACT_PRIO_SYNC_FULL,
MIN_COMPACT_PRIORITY = COMPACT_PRIO_SYNC_FULL,
COMPACT_PRIO_SYNC_LIGHT,
+ MIN_COMPACT_COSTLY_PRIORITY = COMPACT_PRIO_SYNC_LIGHT,
DEF_COMPACT_PRIORITY = COMPACT_PRIO_SYNC_LIGHT,
COMPACT_PRIO_ASYNC,
INIT_COMPACT_PRIORITY = COMPACT_PRIO_ASYNC
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a8703b5..891e388 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3163,6 +3163,7 @@ should_compact_retry(struct alloc_context *ac, int order, int alloc_flags,
int *compaction_retries)
{
int max_retries = MAX_COMPACT_RETRIES;
+ int min_priority;
if (!order)
return false;
@@ -3205,7 +3206,9 @@ should_compact_retry(struct alloc_context *ac, int order, int alloc_flags,
* all retries or failed at the lower priorities.
*/
check_priority:
- if (*compact_priority > MIN_COMPACT_PRIORITY) {
+ min_priority = (order > PAGE_ALLOC_COSTLY_ORDER) ?
+ MIN_COMPACT_COSTLY_PRIORITY : MIN_COMPACT_PRIORITY;
+ if (*compact_priority > min_priority) {
(*compact_priority)--;
*compaction_retries = 0;
return true;