1
0
mirror of https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2026-01-12 01:20:14 +00:00

mm/damon/sysfs-schemes: decouple from damos_wmark_metric

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>
This commit is contained in:
SeongJae Park 2025-06-22 14:37:57 -07:00 committed by Andrew Morton
parent 2bbf41ee98
commit 041f54604f

View 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;
}
}