[PATCH v4 2/2] mm/compaction: reduce the difference between low and high watermarks

From: Michal Clapinski
Date: Fri Apr 04 2025 - 07:11:54 EST


Reduce the diff between low and high watermarks when compaction
proactiveness is set to high. This allows users who set the
proactiveness really high to have more stable fragmentation score over
time.

Signed-off-by: Michal Clapinski <mclapinski@xxxxxxxxxx>
---
Documentation/admin-guide/sysctl/vm.rst | 6 ++++++
mm/compaction.c | 5 +++--
2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-guide/sysctl/vm.rst
index f48eaa98d22d2..d716ff1f37b57 100644
--- a/Documentation/admin-guide/sysctl/vm.rst
+++ b/Documentation/admin-guide/sysctl/vm.rst
@@ -130,6 +130,12 @@ to latency spikes in unsuspecting applications. The kernel employs
various heuristics to avoid wasting CPU cycles if it detects that
proactive compaction is not being effective.

+Setting the value above 80 will, in addition to lowering the acceptable level
+of fragmentation, make the compaction code more sensitive to increases in
+fragmentation, i.e. compaction will trigger more often, but reduce
+fragmentation by a smaller amount.
+This makes the fragmentation level more stable over time.
+
Be careful when setting it to extreme values like 100, as that may
cause excessive background compaction activity.

diff --git a/mm/compaction.c b/mm/compaction.c
index 4ff6b6e1db2da..f29a09def4515 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -2249,10 +2249,11 @@ static unsigned int fragmentation_score_node(pg_data_t *pgdat)

static unsigned int fragmentation_score_wmark(bool low)
{
- unsigned int wmark_low;
+ unsigned int wmark_low, leeway;

wmark_low = 100U - sysctl_compaction_proactiveness;
- return low ? wmark_low : min(wmark_low + 10, 100U);
+ leeway = min(10U, wmark_low / 2);
+ return low ? wmark_low : min(wmark_low + leeway, 100U);
}

static bool should_proactive_compact_node(pg_data_t *pgdat)
--
2.49.0.504.g3bcea36a83-goog