From: sashiko-bot@kernel.org
To: "Liew Rui Yan" <aethernet65535@gmail.com>
Cc: damon@lists.linux.dev
Subject: Re: [RFC PATCH] mm/damon: introduce damos_sort_type for re-ordering regions list
Date: Tue, 04 Aug 2026 10:23:11 +0000 [thread overview]
Message-ID: <20260804102312.E8F8F1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260804100719.116538-1-aethernet65535@gmail.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] Broken `stat.nr_snapshots` tracking in `damos_apply_sorted_scheme()` bypasses `max_nr_snapshots` limit enforcement.
- [High] Sorted schemes are evaluated out of order, violating DAMON's strict scheme priority semantics.
- [Medium] Silent disabling of schemes when `get_scheme_score` is not supported by the underlying operation set.
--
--- Patch [1]: [RFC PATCH] mm/damon: introduce damos_sort_type for re-ordering regions list ---
commit 2f127c3d13c04b9a2b95946211fee29deac96c0d
Author: Liew Rui Yan <aethernet65535@gmail.com>
Subject: mm/damon: introduce damos_sort_type for re-ordering regions list
This patch adds a per-scheme sysfs attribute schemes/<N>/sort_type to allow a
scheme to apply actions to target regions in descending order of their
ops.get_scheme_score() values.
> diff --git a/mm/damon/core.c b/mm/damon/core.c
> index 644daf5a16560..b0c52c9eabe82 100644
> --- a/mm/damon/core.c
> +++ b/mm/damon/core.c
[ ... ]
> @@ -2673,6 +2684,107 @@ static void damon_do_apply_schemes(struct damon_ctx *c,
> }
> }
>
> +struct damos_sort_priv {
> + struct damon_ctx *c;
> + struct damos *s;
> +};
> +
> +static int damos_sort_score_desc_cmp(const void *a, const void *b,
> + const void *priv)
> +{
[ ... ]
> +}
> +
> +static void damos_apply_sorted_scheme(struct damon_ctx *c,
> + struct damon_target *t, struct damos *s)
> +{
> + struct damon_region **arr;
> + struct damon_region *r;
> + struct damos_quota *quota = &s->quota;
> + struct damos_sort_priv priv = { .c = c, .s = s };
> + unsigned long nr = 0, i = 0;
> +
> + if (!c->ops.get_scheme_score)
> + return;
[Severity: Medium]
When the operations set does not implement get_scheme_score, does this early
return silently disable the scheme and prevent stat.nr_snapshots from ever
incrementing?
The unsorted path gracefully handles a missing score callback by falling back
to basic filtering without the score.
> + /* Avoid unnecessary kvmalloc_array() */
> + if (damos_quota_is_full(quota, c->min_region_sz))
> + return;
> +
> + damon_for_each_region(r, t) {
> + if (__damos_valid_target(r, s, c))
> + nr++;
> + }
> + if (nr == 0)
> + return;
[Severity: High]
If there are no valid regions (nr == 0), this returns early without
incrementing s->stat.nr_snapshots. Does this prevent the scheme from ever
reaching max_nr_snapshots and automatically deactivating?
> + if (nr == 1)
> + goto single_valid_region;
> +
> + arr = kvmalloc_array(nr, sizeof(*arr), GFP_KERNEL);
> +
> + if (!arr)
> + return;
> +
> + damon_for_each_region(r, t) {
> + if (__damos_valid_target(r, s, c))
> + arr[i++] = r;
> + }
> +
> + sort_r_nonatomic(arr, nr, sizeof(*arr), damos_sort_score_desc_cmp, NULL, &priv);
> +
> + for (i = 0; i < nr; i++) {
> + r = arr[i];
> +
> + /* Check the quota */
> + if (damos_quota_is_full(quota, c->min_region_sz))
> + break;
> +
> + if (s->max_nr_snapshots &&
> + s->max_nr_snapshots <= s->stat.nr_snapshots)
> + continue;
> +
> + if (damos_valid_target(c, r, s)) {
> + damos_apply_scheme(c, t, r, s);
> + } else {
> + /*
> + * There is no need to continue because the score is
> + * already lower than quota.min_score.
> + */
> + break;
[Severity: High]
If a region fails damos_valid_target() due to low quota scores, this breaks
out of the loop and skips the (i == nr - 1) check below. Does this omit
tracking the snapshot and prevent the scheme from deactivating?
> + }
> +
> + if (i == nr - 1)
> + s->stat.nr_snapshots++;
> + }
> +
> + kvfree(arr);
> + return;
> +
> +single_valid_region:
> + damon_for_each_region(r, t) {
> + if (__damos_valid_target(r, s, c))
> + break;
> + }
> +
> + /* Check the quota */
> + if (damos_quota_is_full(quota, c->min_region_sz))
> + return;
[Severity: High]
If the quota is full in this single_valid_region fast-path, it returns early.
Does this also bypass incrementing s->stat.nr_snapshots?
> +
> + if (s->max_nr_snapshots &&
> + s->max_nr_snapshots <= s->stat.nr_snapshots)
> + return;
> +
> + if (damos_valid_target(c, r, s))
> + damos_apply_scheme(c, t, r, s);
> +
> + s->stat.nr_snapshots++;
> +}
> +
> /*
> * damos_apply_target() - Apply DAMOS schemes to a given target.
> * @c: monitoring context to apply its DAMOS schemes to..
> @@ -2695,6 +2807,17 @@ static void damos_apply_target(struct damon_ctx *c, struct damon_target *t,
> unsigned long max_region_sz)
> {
> struct damon_region *r;
> + struct damos *s;
> +
> + damon_for_each_scheme(s, c) {
> + if (s->sort_type == DAMOS_SORT_NONE)
> + continue;
> + if (!s->wmarks.activated)
> + continue;
> + if (time_before(c->passed_sample_intervals, s->next_apply_sis))
> + continue;
> + damos_apply_sorted_scheme(c, t, s);
> + }
>
> damon_for_each_region(r, t) {
> struct damon_region *prev_r;
>
> damon_do_apply_schemes(c, t, r);
[Severity: High]
By iterating and applying all sorted schemes first, and then iterating to
apply unsorted schemes via damon_do_apply_schemes(), are we executing sorted
schemes out of order?
DAMON evaluates schemes in the order they are defined. If a user defines an
unsorted scheme before a sorted scheme, this two-pass execution will cause
the sorted scheme to evaluate the regions first, breaking the execution
order priority.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260804100719.116538-1-aethernet65535@gmail.com?part=1
next prev parent reply other threads:[~2026-08-04 10:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 10:07 [RFC PATCH] mm/damon: introduce damos_sort_type for re-ordering regions list Liew Rui Yan
2026-08-04 10:23 ` sashiko-bot [this message]
2026-08-04 12:05 ` Liew Rui Yan
2026-08-04 13:58 ` SJ Park
2026-08-05 8:12 ` Liew Rui Yan
2026-08-05 13:51 ` 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=20260804102312.E8F8F1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=aethernet65535@gmail.com \
--cc=damon@lists.linux.dev \
--cc=sashiko-reviews@lists.linux.dev \
/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.