* [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region [not found] <2026092949-surpass-thimble-02a8@gregkh> @ 2026-09-30 9:48 ` SJ Park 2026-09-30 10:05 ` sashiko-bot 2026-10-02 14:19 ` Sasha Levin 0 siblings, 2 replies; 4+ messages in thread From: SJ Park @ 2026-09-30 9:48 UTC (permalink / raw) To: stable; +Cc: damon, Liew Rui Yan, SJ Park, Andrew Morton From: Liew Rui Yan <aethernet65535@gmail.com> 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. Link: https://lore.kernel.org/20260908134739.96919-1-sj@kernel.org Fixes: 50585192bc2e ("mm/damon/schemes: skip already charged targets and regions") Signed-off-by: Liew Rui Yan <aethernet65535@gmail.com> Reviewed-by: SJ Park <sj@kernel.org> Signed-off-by: SJ Park <sj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Cc: <stable@vger.kernel.org> # v5.16.x (cherry picked from commit b3723b596b548c837a766aae3553c14a7b15af2b) Signed-off-by: SJ Park <sj@kernel.org> --- mm/damon/core.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/mm/damon/core.c b/mm/damon/core.c index 859a6a636ab0e..64ff03b15fdef 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -756,6 +756,7 @@ static void damon_do_apply_schemes(struct damon_ctx *c, unsigned long sz = damon_sz_region(r); struct timespec64 begin, end; unsigned long sz_applied = 0; + bool skip = false; if (!s->wmarks.activated) continue; @@ -768,14 +769,11 @@ static void damon_do_apply_schemes(struct damon_ctx *c, if (quota->charge_target_from) { if (t != quota->charge_target_from) continue; - if (r == damon_last_region(t)) { - quota->charge_target_from = NULL; - quota->charge_addr_from = 0; - continue; - } if (quota->charge_addr_from && - r->ar.end <= quota->charge_addr_from) - continue; + r->ar.end <= quota->charge_addr_from) { + skip = true; + goto clean_charge_from_skip; + } if (quota->charge_addr_from && r->ar.start < quota->charge_addr_from) { @@ -783,17 +781,25 @@ static void damon_do_apply_schemes(struct damon_ctx *c, r->ar.start, DAMON_MIN_REGION); if (!sz) { if (damon_sz_region(r) <= - DAMON_MIN_REGION) - continue; + DAMON_MIN_REGION) { + skip = true; + goto clean_charge_from_skip; + } sz = DAMON_MIN_REGION; } damon_split_region_at(t, r, sz); r = damon_next_region(r); sz = damon_sz_region(r); + skip = false; } + } +clean_charge_from_skip: + if (r == damon_last_region(t)) { quota->charge_target_from = NULL; quota->charge_addr_from = 0; } + if (skip) + continue; if (!damos_valid_target(c, t, r, s)) continue; -- 2.47.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region 2026-09-30 9:48 ` [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region SJ Park @ 2026-09-30 10:05 ` sashiko-bot 2026-09-30 10:23 ` SJ Park 2026-10-02 14:19 ` Sasha Levin 1 sibling, 1 reply; 4+ messages in thread From: sashiko-bot @ 2026-09-30 10:05 UTC (permalink / raw) To: SJ Park; +Cc: damon Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] mm/damon: out-of-bounds memory access when region split fails on last region -- commit e8c0d519ccfab8bb3783274c1139b24ab75f8aa1 Author: Liew Rui Yan <aethernet65535@gmail.com> mm/damon/core: fix unconditionally skip last region This commit fixes an issue where the last region of a target is unconditionally skipped and reset when a quota is set, even if it hasn't been processed. Link: https://lore.kernel.org/20260908134739.96919-1-sj@kernel.org > diff --git a/mm/damon/core.c b/mm/damon/core.c > index 859a6a636ab0e..64ff03b15fdef 100644 > --- a/mm/damon/core.c > +++ b/mm/damon/core.c > @@ -768,14 +769,11 @@ static void damon_do_apply_schemes(struct damon_ctx *c, > if (quota->charge_target_from) { > if (t != quota->charge_target_from) > continue; > - if (r == damon_last_region(t)) { > - quota->charge_target_from = NULL; > - quota->charge_addr_from = 0; > - continue; > - } [ ... ] > @@ -783,17 +781,25 @@ static void damon_do_apply_schemes(struct damon_ctx *c, > r->ar.start, DAMON_MIN_REGION); > if (!sz) { > if (damon_sz_region(r) <= > - DAMON_MIN_REGION) > - continue; > + DAMON_MIN_REGION) { > + skip = true; > + goto clean_charge_from_skip; > + } > sz = DAMON_MIN_REGION; > } > damon_split_region_at(t, r, sz); > r = damon_next_region(r); > sz = damon_sz_region(r); [Severity: High] Since this patch removes the early check for the last region, what happens in damon_do_apply_schemes() if damon_split_region_at() fails on the last region? If damon_split_region_at() fails under memory pressure, it returns silently without splitting the region. The code then unconditionally calls r = damon_next_region(r). Because r was the last region and was not split, its list.next points to the list head. damon_next_region() then returns an invalid pointer. The next line calls damon_sz_region(r), which dereferences this invalid pointer and causes an out-of-bounds memory access. Does this code need a check to ensure the region was successfully split before advancing the pointer? -- Sashiko AI review · https://sashiko.dev/#/patchset/20260930094853.52736-1-sj@kernel.org?part=1 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region 2026-09-30 10:05 ` sashiko-bot @ 2026-09-30 10:23 ` SJ Park 0 siblings, 0 replies; 4+ messages in thread From: SJ Park @ 2026-09-30 10:23 UTC (permalink / raw) To: sashiko-bot; +Cc: SJ Park, damon On Wed, 30 Sep 2026 10:05:10 +0000 sashiko-bot@kernel.org wrote: > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: > - [High] mm/damon: out-of-bounds memory access when region split fails on last region > -- > > commit e8c0d519ccfab8bb3783274c1139b24ab75f8aa1 > Author: Liew Rui Yan <aethernet65535@gmail.com> > > mm/damon/core: fix unconditionally skip last region > > This commit fixes an issue where the last region of a target is > unconditionally skipped and reset when a quota is set, even if it hasn't > been processed. > > Link: https://lore.kernel.org/20260908134739.96919-1-sj@kernel.org > > > diff --git a/mm/damon/core.c b/mm/damon/core.c > > index 859a6a636ab0e..64ff03b15fdef 100644 > > --- a/mm/damon/core.c > > +++ b/mm/damon/core.c > > @@ -768,14 +769,11 @@ static void damon_do_apply_schemes(struct damon_ctx *c, > > if (quota->charge_target_from) { > > if (t != quota->charge_target_from) > > continue; > > - if (r == damon_last_region(t)) { > > - quota->charge_target_from = NULL; > > - quota->charge_addr_from = 0; > > - continue; > > - } > > [ ... ] > > > @@ -783,17 +781,25 @@ static void damon_do_apply_schemes(struct damon_ctx *c, > > r->ar.start, DAMON_MIN_REGION); > > if (!sz) { > > if (damon_sz_region(r) <= > > - DAMON_MIN_REGION) > > - continue; > > + DAMON_MIN_REGION) { > > + skip = true; > > + goto clean_charge_from_skip; > > + } > > sz = DAMON_MIN_REGION; > > } > > damon_split_region_at(t, r, sz); > > r = damon_next_region(r); > > sz = damon_sz_region(r); > > [Severity: High] > Since this patch removes the early check for the last region, what happens > in damon_do_apply_schemes() if damon_split_region_at() fails on the last > region? > > If damon_split_region_at() fails under memory pressure, it returns silently > without splitting the region. The code then unconditionally calls > r = damon_next_region(r). > > Because r was the last region and was not split, its list.next points to the > list head. damon_next_region() then returns an invalid pointer. > > The next line calls damon_sz_region(r), which dereferences this invalid > pointer and causes an out-of-bounds memory access. > > Does this code need a check to ensure the region was successfully split before > advancing the pointer? The out-of-bounds memory access is indeed occurs due to this patch. But the lack of damon_split_region_at() error handling was anyway a bug. So, in a sense, pre-existing issue. I will work on fixing it separately. > > -- > Sashiko AI review · https://sashiko.dev/#/patchset/20260930094853.52736-1-sj@kernel.org?part=1 Thanks, SJ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region 2026-09-30 9:48 ` [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region SJ Park 2026-09-30 10:05 ` sashiko-bot @ 2026-10-02 14:19 ` Sasha Levin 1 sibling, 0 replies; 4+ messages in thread From: Sasha Levin @ 2026-10-02 14:19 UTC (permalink / raw) To: stable; +Cc: Sasha Levin, damon, Liew Rui Yan, SJ Park, Andrew Morton > Fix this by only resetting the charge_{target,addr}_from when last region > is reached, only skipping when it is applied or cannot split. I'll hold this until the damon_split_region_at() failure handling fix you mentioned is posted, and then take 6.12, 6.6 and 6.1 together with it. -- Thanks, Sasha ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-10-02 14:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <2026092949-surpass-thimble-02a8@gregkh>
2026-09-30 9:48 ` [PATCH 6.1.y] mm/damon/core: fix unconditionally skip last region SJ Park
2026-09-30 10:05 ` sashiko-bot
2026-09-30 10:23 ` SJ Park
2026-10-02 14:19 ` Sasha Levin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox