Commit 7a271558 authored by Andrea Arcangeli's avatar Andrea Arcangeli

mm: compaction: don't require high order pages below min wmark

The min wmark should be satisfied with just 1 hugepage. And the other
wmarks should be adjusted accordingly. We need to succeed the low
wmark check if there's some significant amount of 0 order pages, but
we don't need plenty of high order pages because the PF_MEMALLOC paths
don't require those. Creating a ton of high order pages that cannot be
allocated by the high order allocation paths (no PF_MEMALLOC) is quite
wasteful because they can be splitted in lower order pages before
anybody has a chance to allocate them.
parent af24516e
......@@ -1874,6 +1874,23 @@ static bool __zone_watermark_ok(struct zone *z, unsigned int order,
if (free_pages - free_cma <= min + z->lowmem_reserve[classzone_idx])
return false;
if (!order)
return true;
/*
* Don't require any high order page under the min
* wmark. Invoking compaction to create lots of high order
* pages below the min wmark is wasteful because those
* hugepages cannot be allocated without PF_MEMALLOC and the
* PF_MEMALLOC paths must not depend on high order allocations
* to succeed.
*/
min = mark - z->watermark[WMARK_MIN];
WARN_ON(min < 0);
if (alloc_flags & ALLOC_HIGH)
min -= min / 2;
if (alloc_flags & ALLOC_HARDER)
min -= min / 4;
for (o = 0; o < order; o++) {
/* At the next order, this order's pages become unavailable */
free_pages -= z->free_area[o].nr_free << o;
......
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