]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/sysfs: implement refresh_ms file internal work
authorSeongJae Park <sj@kernel.org>
Thu, 17 Jul 2025 05:54:46 +0000 (22:54 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 25 Jul 2025 02:12:33 +0000 (19:12 -0700)
Only minimum file operations for refresh_ms file is implemented.  Further
implement its designed behavior, the periodic essential files content
update, using repeat mode damon_call().

If non-zero value is written to the file, update DAMON sysfs files for
auto-tuned monitoring intervals, DAMOS stats, and auto-tuned DAMOS quota
values, which are essential to be monitored in most DAMON use cases.  The
user-written non-zero value becomes the time delay between the update.  If
zero is written to the file, the periodic refresh is disabled.

Link: https://lkml.kernel.org/r/20250717055448.56976-3-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/sysfs.c

index 4296dc201f4d1470975705fd10605dfa6639fc4b..6d2b0dab50cbaa4f303529e523fd32c01c305454 100644 (file)
@@ -1509,6 +1509,32 @@ static struct damon_ctx *damon_sysfs_build_ctx(
        return ctx;
 }
 
+static int damon_sysfs_repeat_call_fn(void *data)
+{
+       struct damon_sysfs_kdamond *sysfs_kdamond = data;
+       static unsigned long next_update_jiffies;
+
+       if (!sysfs_kdamond->refresh_ms)
+               return 0;
+       if (time_before(jiffies, next_update_jiffies))
+               return 0;
+       next_update_jiffies = jiffies +
+               msecs_to_jiffies(sysfs_kdamond->refresh_ms);
+
+       if (!mutex_trylock(&damon_sysfs_lock))
+               return 0;
+       damon_sysfs_upd_tuned_intervals(sysfs_kdamond);
+       damon_sysfs_upd_schemes_stats(sysfs_kdamond);
+       damon_sysfs_upd_schemes_effective_quotas(sysfs_kdamond);
+       mutex_unlock(&damon_sysfs_lock);
+       return 0;
+}
+
+static struct damon_call_control damon_sysfs_repeat_call_control = {
+       .fn = damon_sysfs_repeat_call_fn,
+       .repeat = true,
+};
+
 static int damon_sysfs_turn_damon_on(struct damon_sysfs_kdamond *kdamond)
 {
        struct damon_ctx *ctx;
@@ -1533,6 +1559,9 @@ static int damon_sysfs_turn_damon_on(struct damon_sysfs_kdamond *kdamond)
                return err;
        }
        kdamond->damon_ctx = ctx;
+
+       damon_sysfs_repeat_call_control.data = kdamond;
+       damon_call(ctx, &damon_sysfs_repeat_call_control);
        return err;
 }