mm-damon-core-fix-unconditionally-skip-last-region.patch removed from -mm tree
The quilt patch titled
Subject: mm/damon/core: fix unconditionally skip last region
has been removed from the -mm tree. Its filename was
mm-damon-core-fix-unconditionally-skip-last-region.patch
This patch was dropped because it was merged into the mm-hotfixes-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: Liew Rui Yan <[email protected]>
Subject: mm/damon/core: fix unconditionally skip last region
Date: Tue, 8 Sep 2026 06:47:38 -0700
Once quota set, the charge_{target,addr}_from unconditionally skips and resets at the last region of the tracked target, so the last region can be skipped even when it has not been processed.
Example:
1. Target has 2 regions: R1 (0-100 bytes) and R2 (100-200 bytes).
2. Quota is configured to process only 100 bytes per window.
3. Window 1: Processes R1 (0-100). Quota is full. charge_{target, addr}_from is saved at (Target, 100).
4. Window 2: The loop reaches R2. Because R2 is damon_last_region(t), the old code unconditionally returns true, skipping R2 entirely and resetting the charge_{target,addr}_from.
Result: R2 is permanently skipped even though it has never been processed.
However, it is important to note that this is a very minor issue. This is because it is triggered only when the previous window saved/kept charge_{target,addr}_from, and in the next window, all regions except the last region were skipped by damos_skip_charged_region().
Fix this by only resetting the charge_{target,addr}_from when last region is reached, only skipping when it is applied or cannot split.
---
mm/damon/core.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-)
mm/damon/core.c renamed from mm/damon/core.c~mm-damon-core-fix-unconditionally-skip-last-region +14 -11
@@ -2342,36 +2342,39 @@ static bool damos_skip_charged_region(st {struct damos_quota *quota = &s->quota;unsigned long sz_to_skip; +bool skip = false;/* Skip previously charged regions */ if (quota->charge_target_from) {if (t != quota->charge_target_from)return true; -if (r ==damon_last_region (t)) { - quota->charge_target_from =NULL ; - quota->charge_addr_from =0 ; -return true; - }if (quota->charge_addr_from && - r->ar.end <= quota->charge_addr_from) -return true; + r->ar.end <= quota->charge_addr_from) { + skip = true; + goto out; + }if (quota->charge_addr_from && r->ar.start < quota->charge_addr_from) { sz_to_skip =ALIGN_DOWN (quota->charge_addr_from - r->ar.start, min_region_sz);if (!sz_to_skip) { -if (damon_sz_region (r) <= min_region_sz) -return true; +if (damon_sz_region (r) <= min_region_sz) { + skip = true; + goto out; + } sz_to_skip = min_region_sz; }damon_split_region_at (t, r, sz_to_skip); -return true; + skip = true; } + } +out: +if (r ==damon_last_region (t)) { quota->charge_target_from =NULL ; quota->charge_addr_from =0 ; } -return false; +return skip; } static void damos_update_stat(struct damos *s,
_
Patches currently in -mm which might be from [email protected] are
docs-mm-damon-design-accurate-semantics-of-nr_snapshots.patch docs-mm-damon-design-difference-between-watermarks-and-nr_snapshots.patch docs-mm-damon-design-fix-typo-of-max_nr_snapshots.patch docs-mm-damon-design-clarify-when-qt_exceeds-increases.patch docs-mm-damon-design-fix-typos-in-temporal-auto-tuning-algorithm-section.patch