archive mirror
 help / color / mirror / Atom feed
From: Johannes Weiner <>
To: Andrew Morton <>
Cc: Mel Gorman <>,,,
Subject: [PATCH] mm: don't wake kswapd prematurely when watermark boosting is disabled
Date: Tue, 20 Oct 2020 13:58:33 -0400	[thread overview]
Message-ID: <> (raw)

On 2-node NUMA hosts we see bursts of kswapd reclaim and subsequent
pressure spikes and stalls from cache refaults while there is plenty
of free memory in the system.

Usually, kswapd is woken up when all eligible nodes in an allocation
are full. But the code related to watermark boosting can wake kswapd
on one full node while the other one is mostly empty. This may be
justified to fight fragmentation, but is currently unconditionally
done whether watermark boosting is occurring or not.

In our case, many of our workloads' throughput scales with available
memory, and pure utilization is a more tangible concern than trends
around longer-term fragmentation. As a result we generally disable
watermark boosting.

Wake kswapd only woken when watermark boosting is requested.

Signed-off-by: Johannes Weiner <>
 mm/page_alloc.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index e74ca22baaa1..4f9d9f7e910c 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2470,12 +2470,12 @@ static bool can_steal_fallback(unsigned int order, int start_mt)
 	return false;
-static inline void boost_watermark(struct zone *zone)
+static inline bool boost_watermark(struct zone *zone)
 	unsigned long max_boost;
 	if (!watermark_boost_factor)
-		return;
+		return false;
 	 * Don't bother in zones that are unlikely to produce results.
 	 * On small machines, including kdump capture kernels running
@@ -2483,7 +2483,7 @@ static inline void boost_watermark(struct zone *zone)
 	 * memory situation immediately.
 	if ((pageblock_nr_pages * 4) > zone_managed_pages(zone))
-		return;
+		return false;
 	max_boost = mult_frac(zone->_watermark[WMARK_HIGH],
 			watermark_boost_factor, 10000);
@@ -2497,12 +2497,14 @@ static inline void boost_watermark(struct zone *zone)
 	 * boosted watermark resulting in a hang.
 	if (!max_boost)
-		return;
+		return false;
 	max_boost = max(pageblock_nr_pages, max_boost);
 	zone->watermark_boost = min(zone->watermark_boost + pageblock_nr_pages,
+	return true;
@@ -2540,8 +2542,7 @@ static void steal_suitable_fallback(struct zone *zone, struct page *page,
 	 * likelihood of future fallbacks. Wake kswapd now as the node
 	 * may be balanced overall and kswapd will not wake naturally.
-	boost_watermark(zone);
-	if (alloc_flags & ALLOC_KSWAPD)
+	if (boost_watermark(zone) && (alloc_flags & ALLOC_KSWAPD))
 		set_bit(ZONE_BOOSTED_WATERMARK, &zone->flags);
 	/* We are not allowed to try stealing from the whole block */

             reply	other threads:[~2020-10-20 18:00 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-20 17:58 Johannes Weiner [this message]
2020-10-20 20:33 ` Mel Gorman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \ \ \ \ \ \ \ \
    --subject='Re: [PATCH] mm: don'\''t wake kswapd prematurely when watermark boosting is disabled' \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).