linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Josh Law <objecting@objecting.org>
To: SeongJae Park <sj@kernel.org>
Cc: akpm@linux-foundation.org, damon@lists.linux.dev,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm/damon/core: optimize kdamond_apply_schemes() with pre-filtered scheme list
Date: Mon, 23 Mar 2026 15:18:16 +0000	[thread overview]
Message-ID: <43C21A6B-B27F-428B-B65C-1BBC9D66AF38@objecting.org> (raw)
In-Reply-To: <20260323142051.80436-1-sj@kernel.org>



On 23 March 2026 14:20:51 GMT, SeongJae Park <sj@kernel.org> wrote:
>On Sun, 22 Mar 2026 22:56:27 +0000 Josh Law <objecting@objecting.org> wrote:
>
>> 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");
>
>We may need to increase the size of the array insted of just warning.  That
>will make this code little bit more complicated.  I'm worried at maintenance
>burden from such a complicated code more than the benefit of the optimized
>performance here.
>
>If this is real bottleneck that bothers real users, we should optimize this
>even if it makes code dirty and more difficult to maintain.  But, at the moment
>it is unclear if this is a real bottleneck.
>
>I'd suggest to hold this for now, and revisit if this becomes clearly a
>bottleneck of a real use case, e.g., a user claims so.
>
>
>Thanks,
>SJ
>
>[...]


Yep, ill shelve this at the moment. Thanks for the clarification



V/R


Josh Law


  reply	other threads:[~2026-03-23 15:18 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-22 22:56 Josh Law
2026-03-23 14:20 ` SeongJae Park
2026-03-23 15:18   ` Josh Law [this message]
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=43C21A6B-B27F-428B-B65C-1BBC9D66AF38@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