]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/damon/sysfs-schemes: implement quotas->goal_tuner file
authorSeongJae Park <sj@kernel.org>
Tue, 10 Mar 2026 01:05:20 +0000 (18:05 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:25 +0000 (13:53 -0700)
Add a new DAMON sysfs interface file, namely 'goal_tuner' under the DAMOS
quotas directory.  It is connected to the damos_quota->goal_tuner field.
Users can therefore select their favorite goal-based quotas tuning
algorithm by writing the name of the tuner to the file.  Reading the file
returns the name of the currently selected tuner.

Link: https://lkml.kernel.org/r/20260310010529.91162-5-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/sysfs-schemes.c

index 3a0782e576fab71fe88b9417b9c722094aec904f..5186966dafb35052f31c033842071b8cb5c48f77 100644 (file)
@@ -1488,6 +1488,7 @@ struct damon_sysfs_quotas {
        unsigned long sz;
        unsigned long reset_interval_ms;
        unsigned long effective_sz;     /* Effective size quota in bytes */
+       enum damos_quota_goal_tuner goal_tuner;
 };
 
 static struct damon_sysfs_quotas *damon_sysfs_quotas_alloc(void)
@@ -1610,6 +1611,58 @@ static ssize_t effective_bytes_show(struct kobject *kobj,
        return sysfs_emit(buf, "%lu\n", quotas->effective_sz);
 }
 
+struct damos_sysfs_qgoal_tuner_name {
+       enum damos_quota_goal_tuner tuner;
+       char *name;
+};
+
+static struct damos_sysfs_qgoal_tuner_name damos_sysfs_qgoal_tuner_names[] = {
+       {
+               .tuner = DAMOS_QUOTA_GOAL_TUNER_CONSIST,
+               .name = "consist",
+       },
+       {
+               .tuner = DAMOS_QUOTA_GOAL_TUNER_TEMPORAL,
+               .name = "temporal",
+       },
+};
+
+static ssize_t goal_tuner_show(struct kobject *kobj,
+               struct kobj_attribute *attr, char *buf)
+{
+       struct damon_sysfs_quotas *quotas = container_of(kobj,
+                       struct damon_sysfs_quotas, kobj);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(damos_sysfs_qgoal_tuner_names); i++) {
+               struct damos_sysfs_qgoal_tuner_name *tuner_name;
+
+               tuner_name = &damos_sysfs_qgoal_tuner_names[i];
+               if (tuner_name->tuner == quotas->goal_tuner)
+                       return sysfs_emit(buf, "%s\n", tuner_name->name);
+       }
+       return -EINVAL;
+}
+
+static ssize_t goal_tuner_store(struct kobject *kobj,
+               struct kobj_attribute *attr, const char *buf, size_t count)
+{
+       struct damon_sysfs_quotas *quotas = container_of(kobj,
+                       struct damon_sysfs_quotas, kobj);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(damos_sysfs_qgoal_tuner_names); i++) {
+               struct damos_sysfs_qgoal_tuner_name *tuner_name;
+
+               tuner_name = &damos_sysfs_qgoal_tuner_names[i];
+               if (sysfs_streq(buf, tuner_name->name)) {
+                       quotas->goal_tuner = tuner_name->tuner;
+                       return count;
+               }
+       }
+       return -EINVAL;
+}
+
 static void damon_sysfs_quotas_release(struct kobject *kobj)
 {
        kfree(container_of(kobj, struct damon_sysfs_quotas, kobj));
@@ -1627,11 +1680,15 @@ static struct kobj_attribute damon_sysfs_quotas_reset_interval_ms_attr =
 static struct kobj_attribute damon_sysfs_quotas_effective_bytes_attr =
                __ATTR_RO_MODE(effective_bytes, 0400);
 
+static struct kobj_attribute damon_sysfs_quotas_goal_tuner_attr =
+               __ATTR_RW_MODE(goal_tuner, 0600);
+
 static struct attribute *damon_sysfs_quotas_attrs[] = {
        &damon_sysfs_quotas_ms_attr.attr,
        &damon_sysfs_quotas_sz_attr.attr,
        &damon_sysfs_quotas_reset_interval_ms_attr.attr,
        &damon_sysfs_quotas_effective_bytes_attr.attr,
+       &damon_sysfs_quotas_goal_tuner_attr.attr,
        NULL,
 };
 ATTRIBUTE_GROUPS(damon_sysfs_quotas);
@@ -2718,6 +2775,7 @@ static struct damos *damon_sysfs_mk_scheme(
                .weight_sz = sysfs_weights->sz,
                .weight_nr_accesses = sysfs_weights->nr_accesses,
                .weight_age = sysfs_weights->age,
+               .goal_tuner = sysfs_quotas->goal_tuner,
        };
        struct damos_watermarks wmarks = {
                .metric = sysfs_wmarks->metric,