]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/damon/core: skip needless update of damon_attrs in damon_commit_ctx()
authorBijan Tabatabai <bijantabatab@micron.com>
Wed, 6 Aug 2025 23:42:54 +0000 (18:42 -0500)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 12 Sep 2025 00:24:41 +0000 (17:24 -0700)
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.

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>
mm/damon/core.c

index 08065b3639722474362a33f5997a390d7cc64cc6..d603ca2b18c70bad0d60fc065333d822598fe064 100644 (file)
@@ -570,6 +570,24 @@ 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 +1240,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;