All of lore.kernel.org
 help / color / mirror / Atom feed
From: SJ Park <sj@kernel.org>
To: sashiko-bot@kernel.org
Cc: SJ Park <sj@kernel.org>, damon@lists.linux.dev
Subject: Re: [RFC PATCH 12/16] mm/damon/core: implement damon_has_probe_weight()
Date: Sun,  5 Jul 2026 14:45:16 -0700	[thread overview]
Message-ID: <20260705214519.101117-1-sj@kernel.org> (raw)
In-Reply-To: <20260705211553.25F701F000E9@smtp.kernel.org>

On Sun, 05 Jul 2026 21:15:52 +0000 sashiko-bot@kernel.org wrote:

> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
> 
> New issues:
> - [High] `damon_has_probe_weights()` returns `true` even for DAMON contexts that do not implement the `apply_probes` operation callback (e.g., `vaddr` and `fvaddr`), causing DAMON to silently bypass access checks and completely stop monitoring memory.
> 
> Pre-existing issues:
> - [High] Integer overflow in `abs()` macro usage with large unsigned probe scores breaks DAMON region merging.
> - [High] Multiplication overflow in `damon_merge_two_regions` when calculating merged probe hits and access counts on 32-bit systems.
> --
> 
> commit 4b421534e3283ef89ac2afef3f02956b0510da1e
> Author: SJ Park <sj@kernel.org>
> 
> mm/damon/core: implement damon_has_probe_weight()
>     
> DAMON monitors only data attributes when probe weights are set. However,
> the function for detecting it is intentionally returning false always.
> Now all the building blocks are made. Complete the mode detection function
> so that the mode can really start working.
> 
> > diff --git a/mm/damon/core.c b/mm/damon/core.c
> > index 7a070cfb7cd1b..c7de55865b9c9 100644
> > --- a/mm/damon/core.c
> > +++ b/mm/damon/core.c
> > @@ -211,6 +211,12 @@ static struct damon_probe *damon_nth_probe(int n, struct damon_ctx *ctx)
> >  
> >  static bool damon_has_probe_weights(struct damon_ctx *c)
> >  {
> > +	struct damon_probe *p;
> > +
> > +	damon_for_each_probe(p, c) {
> > +		if (p->weight)
> > +			return true;
> > +	}
> 
> [Severity: High]
> Does this code need to check if the underlying ops struct supports probes?
> 
> If a context like vaddr or fvaddr has a probe weight configured via sysfs,
> this will return true. This causes access_check_disabled to be set to true in
> kdamond_fn(), which skips check_accesses():
> 
> mm/damon/core.c:kdamond_fn() {
>     ...
>     bool access_check_disabled = damon_has_probe_weights(ctx);
>     ...
> }
> 
> Because ctx->ops.apply_probes is NULL for vaddr, the apply block is then
> skipped and max_merge_score remains 0, which causes kdamond_merge_regions()
> to aggressively merge everything with a threshold of 0.

Yes, and no problem.  Users wrongly configure DAMON will get poor quality of
outputs.  No real bad consequences like kernel crash or memory leak happen.

> 
> >  	return false;
> >  }
> 
> I also noticed a couple of pre-existing issues in this file:
> 
> [Severity: High]
> This is a pre-existing issue, but does this code overflow the 32-bit
> boundary on 32-bit systems?
> 
> mm/damon/core.c:damon_merge_two_regions() {
> [ ... ]
> 	l->nr_accesses = (l->nr_accesses * sz_l + r->nr_accesses * sz_r) /
> 			(sz_l + sz_r);
> [ ... ]
> 	for (i = 0; i < DAMON_MAX_PROBES; i++)
> 		l->probe_hits[i] = (l->probe_hits[i] * sz_l + r->probe_hits[i]
> 				* sz_r) / (sz_l + sz_r);
> [ ... ]
> }
> 
> If a region size reaches around 42MB on a 32-bit architecture and
> nr_accesses is around 100, the multiplication nr_accesses * sz_l could
> exceed 4.2 billion and silently overflow the 32-bit unsigned long,
> corrupting the memory access statistics for merged regions.

Known low priority issue.  On 32-bit architectures users could use the
addr_unit parameter to avoid this.

> 
> [Severity: High]
> This is a pre-existing issue, but can the absolute difference of two large
> unsigned integers be evaluated incorrectly here?
> 
> mm/damon/core.c:damon_merge_regions_of() {
> [ ... ]
> 		score = damon_merge_score(r, false, ctx, use_probe_hits);
> 		last_score = damon_merge_score(r, true, ctx, use_probe_hits);
> 
> 		if (abs(score - last_score) > thres)
> 			r->age = 0;
> [ ... ]
> }
> 
> If a user configures a large probe weight via sysfs such that the weighted
> sum exceeds INT_MAX, score - last_score produces a large unsigned int. The
> abs() macro explicitly casts unsigned types to signed types, which would
> wrap into a negative signed integer and then be negated into a much smaller
> positive value. This could bypass the greater than threshold check and
> prevent regions from resetting their age.

Pre-existing issue.  I will separately work on this.

> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/20260705205743.98656-1-sj@kernel.org?part=12


Thanks,
SJ

  reply	other threads:[~2026-07-05 21:45 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-05 20:57 [RFC PATCH 00/16] mm/damon: introduce data attributes only monitoring SJ Park
2026-07-05 20:57 ` [RFC PATCH 01/16] mm/damon/core: introduce damon_probe->weight SJ Park
2026-07-05 21:04   ` sashiko-bot
2026-07-05 21:21     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 02/16] mm/damon/core: ask apply_probes() ops callback to set sampling address SJ Park
2026-07-05 21:07   ` sashiko-bot
2026-07-05 21:25     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 03/16] mm/damon/paddr: set samples in apply_probes() if requested SJ Park
2026-07-05 21:11   ` sashiko-bot
2026-07-05 21:28     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 04/16] mm/damon/core: ask apply_probe() to return max probe hits weighted sum SJ Park
2026-07-05 20:57 ` [RFC PATCH 05/16] mm/damon/core: implement damon_probe_hits_wsum() SJ Park
2026-07-05 21:13   ` sashiko-bot
2026-07-05 21:30     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 06/16] mm/damon/paddr: respect return_max_wsum SJ Park
2026-07-05 20:57 ` [RFC PATCH 07/16] mm/damon/core: extend merge function to work with probe hits SJ Park
2026-07-05 21:11   ` sashiko-bot
2026-07-05 21:38     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 08/16] mm/damon/core: disable access monitoring when probe weights are set SJ Park
2026-07-05 21:19   ` sashiko-bot
2026-07-05 20:57 ` [RFC PATCH 09/16] mm/damon/core: set samples in apply_probes() if " SJ Park
2026-07-05 20:57 ` [RFC PATCH 10/16] mm/damon/core: s/max_nr_accesses/max_merge_score/ in kdamond_fn() SJ Park
2026-07-05 20:57 ` [RFC PATCH 11/16] mm/damon/core: get merge threshold from probe hits when weights are set SJ Park
2026-07-05 21:12   ` sashiko-bot
2026-07-05 21:41     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 12/16] mm/damon/core: implement damon_has_probe_weight() SJ Park
2026-07-05 21:15   ` sashiko-bot
2026-07-05 21:45     ` SJ Park [this message]
2026-07-05 20:57 ` [RFC PATCH 13/16] mm/damon/sysfs: implement probe/weight file SJ Park
2026-07-05 20:57 ` [RFC PATCH 14/16] Docs/mm/damon/design: document attrs-only monitoring SJ Park
2026-07-05 21:05   ` sashiko-bot
2026-07-05 21:46     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 15/16] Docs/admin-guide/mm/damon/usage: document weight sysfs file SJ Park
2026-07-05 21:07   ` sashiko-bot
2026-07-05 21:48     ` SJ Park
2026-07-05 20:57 ` [RFC PATCH 16/16] Docs/ABI/damon: document probe weight file SJ Park

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260705214519.101117-1-sj@kernel.org \
    --to=sj@kernel.org \
    --cc=damon@lists.linux.dev \
    --cc=sashiko-bot@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.