Skip to contentSkip to conversation

FAILED: patch "[PATCH] mm/damon/core: disallow time-quota setting zero esz" failed to apply to 6.6-stable tree

PATCH In review [email protected] 3 participants 4 messages May 3 – May 6

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

To reproduce the conflict and resubmit, you may use the following commands:

git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 8bbde987c2b84f80da0853f739f0a920386f8b99
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026050319-verbally-voltage-207f@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..

Possible dependencies:

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From 8bbde987c2b84f80da0853f739f0a920386f8b99 Mon Sep 17 00:00:00 2001
From: SeongJae Park <[email protected]>
Date: Mon, 6 Apr 2026 17:31:52 -0700
Subject: [PATCH] mm/damon/core: disallow time-quota setting zero esz

When the throughput of a DAMOS scheme is very slow, DAMOS time quota can make the effective size quota smaller than damon_ctx->min_region_sz. In the case, damos_apply_scheme() will skip applying the action, because the action is tried at region level, which requires >=min_region_sz size. That is, the quota is effectively exceeded for the quota charge window.

Because no action will be applied, the total_charged_sz and total_charged_ns are also not updated. damos_set_effective_quota() will try to update the effective size quota before starting the next charge window. However, because the total_charged_sz and total_charged_ns have not updated, the throughput and effective size quota are also not changed. Since effective size quota can only be decreased, other effective size quota update factors including DAMOS quota goals and size quota cannot make any change, either.

As a result, the scheme is unexpectedly deactivated until the user notices and mitigates the situation. The users can mitigate this situation by changing the time quota online or re-install the scheme. While the mitigation is somewhat straightforward, finding the situation would be challenging, because DAMON is not providing good observabilities for that. Even if such observability is provided, doing the additional monitoring and the mitigation is somewhat cumbersome and not aligned to the intention of the time quota. The time quota was intended to help reduce the user's administration overhead.

Fix the problem by setting time quota-modified effective size quota be at least min_region_sz always.

The issue was discovered [1] by sashiko.

mm/damon/core.c +5 -3
index 3e1890d64d06..3703f62a876b 100644
@@ -2228,7 +2228,8 @@ static unsigned long damos_quota_score(struct damos_quota *quota)
 /*
  * Called only if quota->ms, or quota->sz are set, or quota->goals is not empty
  */
-static void damos_set_effective_quota(struct damos_quota *quota)
+static void damos_set_effective_quota(struct damos_quota *quota,
+		struct damon_ctx *ctx)
 {
 	unsigned long throughput;
 	unsigned long esz = ULONG_MAX;
@@ -2254,6 +2255,7 @@ static void damos_set_effective_quota(struct damos_quota *quota)
 		else
 			throughput = PAGE_SIZE * 1024;
 		esz = min(throughput * quota->ms, esz);
+		esz = max(ctx->min_region_sz, esz);
 	}
 
 	if (quota->sz && quota->sz < esz)
@@ -2290,7 +2292,7 @@ static void damos_adjust_quota(struct damon_ctx *c, struct damos *s)
 	/* First charge window */
 	if (!quota->total_charged_sz && !quota->charged_from) {
 		quota->charged_from = jiffies;
-		damos_set_effective_quota(quota);
+		damos_set_effective_quota(quota, c);
 	}
 
 	/* New charge window starts */
@@ -2303,7 +2305,7 @@ static void damos_adjust_quota(struct damon_ctx *c, struct damos *s)
 		quota->charged_sz = 0;
 		if (trace_damos_esz_enabled())
 			cached_esz = quota->esz;
-		damos_set_effective_quota(quota);
+		damos_set_effective_quota(quota, c);
 		if (trace_damos_esz_enabled() && quota->esz != cached_esz)
 			damos_trace_esz(c, s, quota);
 	}
maintainer
#1 lore raw

PATCH 1/1 mm/damon/core: disallow time-quota setting zero esz

When the throughput of a DAMOS scheme is very slow, DAMOS time quota can make the effective size quota smaller than damon_ctx->min_region_sz. In the case, damos_apply_scheme() will skip applying the action, because the action is tried at region level, which requires >=min_region_sz size. That is, the quota is effectively exceeded for the quota charge window.

Because no action will be applied, the total_charged_sz and total_charged_ns are also not updated. damos_set_effective_quota() will try to update the effective size quota before starting the next charge window. However, because the total_charged_sz and total_charged_ns have not updated, the throughput and effective size quota are also not changed. Since effective size quota can only be decreased, other effective size quota update factors including DAMOS quota goals and size quota cannot make any change, either.

As a result, the scheme is unexpectedly deactivated until the user notices and mitigates the situation. The users can mitigate this situation by changing the time quota online or re-install the scheme. While the mitigation is somewhat straightforward, finding the situation would be challenging, because DAMON is not providing good observabilities for that. Even if such observability is provided, doing the additional monitoring and the mitigation is somewhat cumbersome and not aligned to the intention of the time quota. The time quota was intended to help reduce the user's administration overhead.

Fix the problem by setting time quota-modified effective size quota be at least min_region_sz always.

The issue was discovered [1] by sashiko.

Fixes 1cd243030059 ("mm/damon/schemes: implement time quota")
Cc <[email protected]> # 5.16.x
(cherry picked from commit 8bbde987c2b84f80da0853f739f0a920386f8b99)
---
 mm/damon/core.c | 1 +
 1 file changed, 1 insertion(+)
mm/damon/core.c +1 -0
index 48747236c21c..12c2e584659a 100644
@@ -1026,6 +1026,7 @@ static void damos_set_effective_quota(struct damos_quota *quota)
 	else
 		throughput = PAGE_SIZE * 1024;
 	esz = throughput * quota->ms;
+	esz = max(DAMON_MIN_REGION, esz);
 
 	if (quota->sz && quota->sz < esz)
 		esz = quota->sz;
Signature · 1 line
2.47.3
#2 lore raw

Re: [PATCH 6.6.y] mm/damon/core: disallow time-quota setting zero esz

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] Integer overflow in throughput estimation permanently breaks DAMOS time quota mechanism. --

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Integer overflow in throughput estimation permanently breaks DAMOS time quota mechanism. --

commit 352051c643d14056b79b910e005f54b4d071e250
Author: SeongJae Park <[email protected]>

mm/damon/core: disallow time-quota setting zero esz

This patch fixes an issue where a slow DAMOS scheme causes the effective size quota to fall below the minimum region size, which prevents actions from being applied. Because no actions are applied, the charge statistics stop updating and the scheme is unexpectedly deactivated. The fix ensures the effective size quota is always clamped to at least the minimum region size.

mm/damon/core.c static void damos_set_effective_quota(struct damos_quota *quota) · line 1028

Quoted 8 lines
mm/damon/core.c +0 -0
index 48747236c21c..12c2e584659a 100644
@@ -1026,6 +1026,7 @@ static void damos_set_effective_quota(struct damos_quota *quota)
 	else
 		throughput = PAGE_SIZE * 1024;
 	esz = throughput * quota->ms;

Since total_charged_sz accumulates lifetime processed bytes without being reset, can the throughput calculation that precedes this line cause a regression by overflowing?

In damos_set_effective_quota(), throughput is calculated as:
throughput = quota->total_charged_sz * 1000000 / quota->total_charged_ns;

On 32-bit architectures, total_charged_sz * 1000000 would overflow when total_charged_sz reaches just 4295 bytes. On 64-bit architectures, it would overflow after about 18.44 TB of memory processed.

Once total_charged_sz * 1000000 wraps around, the numerator becomes extremely small compared to the denominator (which on 64-bit takes 584 years to wrap), causing the computed throughput to instantly drop to near zero.

mm/damon/core.c static void damos_set_effective_quota(struct damos_quota *quota) · line 1029

Quoted 1 line
mm/damon/core.c +1 -0
+	esz = max(DAMON_MIN_REGION, esz);

Although this clamping ensures esz never drops below DAMON_MIN_REGION, would the scheme become permanently throttled down to this minimum region size until the numerator catches up again after another 18 TB of processing?

Quoted 3 lines
mm/damon/core.c +0 -0
 	if (quota->sz && quota->sz < esz)
 		esz = quota->sz;
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=1
maintainer
#3 lore raw

Re: [PATCH 6.6.y] mm/damon/core: disallow time-quota setting zero esz

Quoted 2 lines · On Mon, 04 May 2026 14:26:22 +0000 [email protected] wrote:

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Integer overflow in throughput estimation permanently breaks DAMOS time quota mechanism.

Mild issue that not an issue for this patch. Read below for more details.

Quoted 40 lines

--

commit 352051c643d14056b79b910e005f54b4d071e250
Author: SeongJae Park <[email protected]>

mm/damon/core: disallow time-quota setting zero esz

This patch fixes an issue where a slow DAMOS scheme causes the effective size quota to fall below the minimum region size, which prevents actions from being applied. Because no actions are applied, the charge statistics stop updating and the scheme is unexpectedly deactivated. The fix ensures the effective size quota is always clamped to at least the minimum region size.

mm/damon/core.c static void damos_set_effective_quota(struct damos_quota *quota) · line 1028

Quoted 8 lines
mm/damon/core.c +0 -0
index 48747236c21c..12c2e584659a 100644
@@ -1026,6 +1026,7 @@ static void damos_set_effective_quota(struct damos_quota *quota)
 	else
 		throughput = PAGE_SIZE * 1024;
 	esz = throughput * quota->ms;

Since total_charged_sz accumulates lifetime processed bytes without being reset, can the throughput calculation that precedes this line cause a regression by overflowing?

In damos_set_effective_quota(), throughput is calculated as:
throughput = quota->total_charged_sz * 1000000 / quota->total_charged_ns;

On 32-bit architectures, total_charged_sz * 1000000 would overflow when total_charged_sz reaches just 4295 bytes. On 64-bit architectures, it would overflow after about 18.44 TB of memory processed.

Once total_charged_sz * 1000000 wraps around, the numerator becomes extremely small compared to the denominator (which on 64-bit takes 584 years to wrap), causing the computed throughput to instantly drop to near zero.

Quoted 5 lines

mm/damon/core.c static void damos_set_effective_quota(struct damos_quota *quota) · line 1029

Quoted 1 line
mm/damon/core.c +1 -0
+	esz = max(DAMON_MIN_REGION, esz);

Although this clamping ensures esz never drops below DAMON_MIN_REGION, would the scheme become permanently throttled down to this minimum region size until the numerator catches up again after another 18 TB of processing?

Not this patch's fault. The user impact should also be trivial. Please refer to my previous answer [1] to the similar Sashiko question.

[1] https://lore.kernel.org/[email protected]

Thanks,
SJ

[...]