mm/damon/core: skip needless update of damon_attrs in damon_commit_ctx()

Currently, damon_commit_ctx() always calls damon_set_attrs() even if the
attributes have not been changed.  This can be problematic when the DAMON
state is committed relatively frequently because damon_set_attrs() resets
ctx->next_{aggregation,ops_update}_sis, causing aggregation and ops update
operations to be needlessly delayed.

This patch avoids this by only calling damon_set_attrs() in
damon_commit_ctx when the attributes have been changed.

[akpm@linux-foundation.org: 
  Link: https://lkml.kernel.org/r/20250807001924.76275-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20250806234254.10572-1-bijan311@gmail.com
Signed-off-by: Bijan Tabatabai <bijantabatab@micron.com>
Reviewed-by: SeongJae Park <sj@kernel.org>
Cc: Bijan Tabatabai <bijan311@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Bijan Tabatabai 2025-08-06 18:42:54 -05:00 committed by Andrew Morton
parent 878d9e8ceb
commit dc32c8d487

View File

@ -570,6 +570,23 @@ void damon_destroy_ctx(struct damon_ctx *ctx)
kfree(ctx);
}
static bool damon_attrs_equals(const struct damon_attrs *attrs1,
const struct damon_attrs *attrs2)
{
const struct damon_intervals_goal *ig1 = &attrs1->intervals_goal;
const struct damon_intervals_goal *ig2 = &attrs2->intervals_goal;
return attrs1->sample_interval == attrs2->sample_interval &&
attrs1->aggr_interval == attrs2->aggr_interval &&
attrs1->ops_update_interval == attrs2->ops_update_interval &&
attrs1->min_nr_regions == attrs2->min_nr_regions &&
attrs1->max_nr_regions == attrs2->max_nr_regions &&
ig1->access_bp == ig2->access_bp &&
ig1->aggrs == ig2->aggrs &&
ig1->min_sample_us == ig2->min_sample_us &&
ig1->max_sample_us == ig2->max_sample_us;
}
static unsigned int damon_age_for_new_attrs(unsigned int age,
struct damon_attrs *old_attrs, struct damon_attrs *new_attrs)
{
@ -1222,9 +1239,11 @@ int damon_commit_ctx(struct damon_ctx *dst, struct damon_ctx *src)
* 2. ops update should be done after pid handling is done (target
* committing require putting pids).
*/
err = damon_set_attrs(dst, &src->attrs);
if (err)
return err;
if (!damon_attrs_equals(&dst->attrs, &src->attrs)) {
err = damon_set_attrs(dst, &src->attrs);
if (err)
return err;
}
dst->ops = src->ops;
return 0;