|
@@ -1759,6 +1759,9 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order,
|
|
|
/* The OOM killer will not help higher order allocs */
|
|
|
if (order > PAGE_ALLOC_COSTLY_ORDER)
|
|
|
goto out;
|
|
|
+ /* The OOM killer does not needlessly kill tasks for lowmem */
|
|
|
+ if (high_zoneidx < ZONE_NORMAL)
|
|
|
+ goto out;
|
|
|
/*
|
|
|
* GFP_THISNODE contains __GFP_NORETRY and we never hit this.
|
|
|
* Sanity check for bare calls of __GFP_THISNODE, not real OOM.
|
|
@@ -2052,15 +2055,23 @@ rebalance:
|
|
|
if (page)
|
|
|
goto got_pg;
|
|
|
|
|
|
- /*
|
|
|
- * The OOM killer does not trigger for high-order
|
|
|
- * ~__GFP_NOFAIL allocations so if no progress is being
|
|
|
- * made, there are no other options and retrying is
|
|
|
- * unlikely to help.
|
|
|
- */
|
|
|
- if (order > PAGE_ALLOC_COSTLY_ORDER &&
|
|
|
- !(gfp_mask & __GFP_NOFAIL))
|
|
|
- goto nopage;
|
|
|
+ if (!(gfp_mask & __GFP_NOFAIL)) {
|
|
|
+ /*
|
|
|
+ * The oom killer is not called for high-order
|
|
|
+ * allocations that may fail, so if no progress
|
|
|
+ * is being made, there are no other options and
|
|
|
+ * retrying is unlikely to help.
|
|
|
+ */
|
|
|
+ if (order > PAGE_ALLOC_COSTLY_ORDER)
|
|
|
+ goto nopage;
|
|
|
+ /*
|
|
|
+ * The oom killer is not called for lowmem
|
|
|
+ * allocations to prevent needlessly killing
|
|
|
+ * innocent tasks.
|
|
|
+ */
|
|
|
+ if (high_zoneidx < ZONE_NORMAL)
|
|
|
+ goto nopage;
|
|
|
+ }
|
|
|
|
|
|
goto restart;
|
|
|
}
|