]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/damon/sysfs-schemes: decouple from damos_wmark_metric
authorSeongJae Park <sj@kernel.org>
Sun, 22 Jun 2025 21:37:57 +0000 (14:37 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 10 Jul 2025 05:42:21 +0000 (22:42 -0700)
Decouple DAMOS sysfs interface from damos_wmark_metric.  For this, define
and use new sysfs-schemes internal data structure that maps the user-space
keywords and damos_wmark_metric, instead of having the implicit and
unflexible array index rule.

Link: https://lkml.kernel.org/r/20250622213759.50930-4-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 8a00a76a713f5169079aee4083427efd10b289d4..62150d32d30a854c4efb741938f7e14a02615c3a 100644 (file)
@@ -785,10 +785,21 @@ static struct damon_sysfs_watermarks *damon_sysfs_watermarks_alloc(
        return watermarks;
 }
 
-/* Should match with enum damos_wmark_metric */
-static const char * const damon_sysfs_wmark_metric_strs[] = {
-       "none",
-       "free_mem_rate",
+struct damos_sysfs_wmark_metric_name {
+       enum damos_wmark_metric metric;
+       char *name;
+};
+
+static const struct damos_sysfs_wmark_metric_name
+damos_sysfs_wmark_metric_names[] = {
+       {
+               .metric = DAMOS_WMARK_NONE,
+               .name = "none",
+       },
+       {
+               .metric = DAMOS_WMARK_FREE_MEM_RATE,
+               .name = "free_mem_rate",
+       },
 };
 
 static ssize_t metric_show(struct kobject *kobj, struct kobj_attribute *attr,
@@ -796,9 +807,16 @@ static ssize_t metric_show(struct kobject *kobj, struct kobj_attribute *attr,
 {
        struct damon_sysfs_watermarks *watermarks = container_of(kobj,
                        struct damon_sysfs_watermarks, kobj);
+       int i;
 
-       return sysfs_emit(buf, "%s\n",
-                       damon_sysfs_wmark_metric_strs[watermarks->metric]);
+       for (i = 0; i < ARRAY_SIZE(damos_sysfs_wmark_metric_names); i++) {
+               const struct damos_sysfs_wmark_metric_name *metric_name;
+
+               metric_name = &damos_sysfs_wmark_metric_names[i];
+               if (metric_name->metric == watermarks->metric)
+                       return sysfs_emit(buf, "%s\n", metric_name->name);
+       }
+       return -EINVAL;
 }
 
 static ssize_t metric_store(struct kobject *kobj, struct kobj_attribute *attr,
@@ -806,11 +824,14 @@ static ssize_t metric_store(struct kobject *kobj, struct kobj_attribute *attr,
 {
        struct damon_sysfs_watermarks *watermarks = container_of(kobj,
                        struct damon_sysfs_watermarks, kobj);
-       enum damos_wmark_metric metric;
+       int i;
 
-       for (metric = 0; metric < NR_DAMOS_WMARK_METRICS; metric++) {
-               if (sysfs_streq(buf, damon_sysfs_wmark_metric_strs[metric])) {
-                       watermarks->metric = metric;
+       for (i = 0; i < ARRAY_SIZE(damos_sysfs_wmark_metric_names); i++) {
+               const struct damos_sysfs_wmark_metric_name *metric_name;
+
+               metric_name = &damos_sysfs_wmark_metric_names[i];
+               if (sysfs_streq(buf, metric_name->name)) {
+                       watermarks->metric = metric_name->metric;
                        return count;
                }
        }