FAILED: patch "[PATCH] mm/damon/core: disallow time-quota setting zero esz" failed to apply to 6.6-stable tree
Subsystems (3)
[email protected]
maintainerThe 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
@@ -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); }
SeongJae Park
maintainerPATCH 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.
--- mm/damon/core.c | 1 + 1 file changed, 1 insertion(+)
mm/damon/core.c +1 -0
@@ -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
[email protected]
AI reviewRe: [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@@ -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
-0if (quota->sz && quota->sz < esz) esz = quota->sz;
Signature · 1 line
Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=1
SeongJae Park
maintainerRe: [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 eszThis 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@@ -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_szaccumulates 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 whentotal_charged_szreaches 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
[...]