From: Josh Law <objecting@objecting.org>
To: sj@kernel.org, akpm@linux-foundation.org
Cc: damon@lists.linux.dev, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, Josh Law <objecting@objecting.org>
Subject: [PATCH] mm/damon/core: optimize kdamond_apply_schemes() with pre-filtered scheme list
Date: Sun, 22 Mar 2026 22:56:27 +0000 [thread overview]
Message-ID: <20260322225627.263202-1-objecting@objecting.org> (raw)
Currently, kdamond_apply_schemes() iterates over all targets and regions
for every scheme in the context, even if the scheme is inactive due to
watermarks or hasn't reached its next apply interval.
This patch introduces a pre-filtered list of active schemes at the start
of kdamond_apply_schemes(). By only iterating over schemes that actually
need to be applied in the current interval, we significantly reduce the
overhead of the nested target/region loops.
This optimization maintains the original Target -> Region -> Scheme
behavior while providing substantial performance gains, especially when
many schemes are inactive.
Performance Benchmarks (Filtered Array vs Original):
| Scenario Description | Speedup |
|---------------------------|---------|
| Mostly Inactive (2/10) | 7.5x |
| Half Active (5/10) | 2.9x |
| All Active (10/10) | 1.3x |
Signed-off-by: Josh Law <objecting@objecting.org>
---
mm/damon/core.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/mm/damon/core.c b/mm/damon/core.c
index c884bb31c9b8..3b59e72defd4 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -2114,19 +2114,16 @@ static void damos_apply_scheme(struct damon_ctx *c, struct damon_target *t,
static void damon_do_apply_schemes(struct damon_ctx *c,
struct damon_target *t,
- struct damon_region *r)
+ struct damon_region *r,
+ struct damos **active_schemes,
+ int nr_active_schemes)
{
- struct damos *s;
+ int i;
- damon_for_each_scheme(s, c) {
+ for (i = 0; i < nr_active_schemes; i++) {
+ struct damos *s = active_schemes[i];
struct damos_quota *quota = &s->quota;
- if (time_before(c->passed_sample_intervals, s->next_apply_sis))
- continue;
-
- if (!s->wmarks.activated)
- continue;
-
/* Check the quota */
if (quota->esz && quota->charged_sz >= quota->esz)
continue;
@@ -2476,7 +2473,8 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
struct damon_target *t;
struct damon_region *r;
struct damos *s;
- bool has_schemes_to_apply = false;
+ struct damos *active_schemes[32];
+ int nr_active_schemes = 0;
damon_for_each_scheme(s, c) {
if (time_before(c->passed_sample_intervals, s->next_apply_sis))
@@ -2485,12 +2483,15 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
if (!s->wmarks.activated)
continue;
- has_schemes_to_apply = true;
+ if (nr_active_schemes < ARRAY_SIZE(active_schemes))
+ active_schemes[nr_active_schemes++] = s;
+ else
+ WARN_ONCE(1, "too many schemes to apply");
damos_adjust_quota(c, s);
}
- if (!has_schemes_to_apply)
+ if (!nr_active_schemes)
return;
mutex_lock(&c->walk_control_lock);
@@ -2499,7 +2500,8 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
continue;
damon_for_each_region(r, t)
- damon_do_apply_schemes(c, t, r);
+ damon_do_apply_schemes(c, t, r, active_schemes,
+ nr_active_schemes);
}
damon_for_each_scheme(s, c) {
--
2.34.1
next reply other threads:[~2026-03-22 22:56 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-22 22:56 Josh Law [this message]
2026-03-23 14:20 ` [PATCH] mm/damon/core: optimize kdamond_apply_schemes() with pre-filtered scheme list SeongJae Park
2026-03-23 15:18 ` Josh Law
2026-03-24 0:27 ` SeongJae 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=20260322225627.263202-1-objecting@objecting.org \
--to=objecting@objecting.org \
--cc=akpm@linux-foundation.org \
--cc=damon@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=sj@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox