Skip to content

Commit ac35264

Browse files
sjp38akpm00
authored andcommitted
mm/damon/sysfs-schemes: implement filters directory
DAMOS filters are currently supported by only DAMON kernel API. To expose the feature to user space, implement a DAMON sysfs directory named 'filters' under each scheme directory. Please note that this is implementing only the directory. Following commits will implement more files and directories, and finally connect the DAMOS filters feature. Link: https://lkml.kernel.org/r/20221205230830.144349-6-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Shuah Khan <shuah@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent d56fe24 commit ac35264

File tree

1 file changed

+84
-1
lines changed

1 file changed

+84
-1
lines changed

mm/damon/sysfs-schemes.c

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,63 @@ static struct kobj_type damon_sysfs_stats_ktype = {
258258
.default_groups = damon_sysfs_stats_groups,
259259
};
260260

261+
/*
262+
* filters directory
263+
*/
264+
265+
struct damon_sysfs_scheme_filters {
266+
struct kobject kobj;
267+
int nr;
268+
};
269+
270+
static struct damon_sysfs_scheme_filters *
271+
damon_sysfs_scheme_filters_alloc(void)
272+
{
273+
return kzalloc(sizeof(struct damon_sysfs_scheme_filters), GFP_KERNEL);
274+
}
275+
276+
static ssize_t nr_filters_show(struct kobject *kobj,
277+
struct kobj_attribute *attr, char *buf)
278+
{
279+
struct damon_sysfs_scheme_filters *filters = container_of(kobj,
280+
struct damon_sysfs_scheme_filters, kobj);
281+
282+
return sysfs_emit(buf, "%d\n", filters->nr);
283+
}
284+
285+
static ssize_t nr_filters_store(struct kobject *kobj,
286+
struct kobj_attribute *attr, const char *buf, size_t count)
287+
{
288+
int nr, err = kstrtoint(buf, 0, &nr);
289+
290+
if (err)
291+
return err;
292+
if (nr < 0)
293+
return -EINVAL;
294+
295+
return count;
296+
}
297+
298+
static void damon_sysfs_scheme_filters_release(struct kobject *kobj)
299+
{
300+
kfree(container_of(kobj, struct damon_sysfs_scheme_filters, kobj));
301+
}
302+
303+
static struct kobj_attribute damon_sysfs_scheme_filters_nr_attr =
304+
__ATTR_RW_MODE(nr_filters, 0600);
305+
306+
static struct attribute *damon_sysfs_scheme_filters_attrs[] = {
307+
&damon_sysfs_scheme_filters_nr_attr.attr,
308+
NULL,
309+
};
310+
ATTRIBUTE_GROUPS(damon_sysfs_scheme_filters);
311+
312+
static struct kobj_type damon_sysfs_scheme_filters_ktype = {
313+
.release = damon_sysfs_scheme_filters_release,
314+
.sysfs_ops = &kobj_sysfs_ops,
315+
.default_groups = damon_sysfs_scheme_filters_groups,
316+
};
317+
261318
/*
262319
* watermarks directory
263320
*/
@@ -784,6 +841,7 @@ struct damon_sysfs_scheme {
784841
struct damon_sysfs_access_pattern *access_pattern;
785842
struct damon_sysfs_quotas *quotas;
786843
struct damon_sysfs_watermarks *watermarks;
844+
struct damon_sysfs_scheme_filters *filters;
787845
struct damon_sysfs_stats *stats;
788846
struct damon_sysfs_scheme_regions *tried_regions;
789847
};
@@ -878,6 +936,24 @@ static int damon_sysfs_scheme_set_watermarks(struct damon_sysfs_scheme *scheme)
878936
return err;
879937
}
880938

939+
static int damon_sysfs_scheme_set_filters(struct damon_sysfs_scheme *scheme)
940+
{
941+
struct damon_sysfs_scheme_filters *filters =
942+
damon_sysfs_scheme_filters_alloc();
943+
int err;
944+
945+
if (!filters)
946+
return -ENOMEM;
947+
err = kobject_init_and_add(&filters->kobj,
948+
&damon_sysfs_scheme_filters_ktype, &scheme->kobj,
949+
"filters");
950+
if (err)
951+
kobject_put(&filters->kobj);
952+
else
953+
scheme->filters = filters;
954+
return err;
955+
}
956+
881957
static int damon_sysfs_scheme_set_stats(struct damon_sysfs_scheme *scheme)
882958
{
883959
struct damon_sysfs_stats *stats = damon_sysfs_stats_alloc();
@@ -926,9 +1002,12 @@ static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme)
9261002
err = damon_sysfs_scheme_set_watermarks(scheme);
9271003
if (err)
9281004
goto put_quotas_access_pattern_out;
929-
err = damon_sysfs_scheme_set_stats(scheme);
1005+
err = damon_sysfs_scheme_set_filters(scheme);
9301006
if (err)
9311007
goto put_watermarks_quotas_access_pattern_out;
1008+
err = damon_sysfs_scheme_set_stats(scheme);
1009+
if (err)
1010+
goto put_filters_watermarks_quotas_access_pattern_out;
9321011
err = damon_sysfs_scheme_set_tried_regions(scheme);
9331012
if (err)
9341013
goto put_tried_regions_out;
@@ -937,6 +1016,9 @@ static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme)
9371016
put_tried_regions_out:
9381017
kobject_put(&scheme->tried_regions->kobj);
9391018
scheme->tried_regions = NULL;
1019+
put_filters_watermarks_quotas_access_pattern_out:
1020+
kobject_put(&scheme->filters->kobj);
1021+
scheme->filters = NULL;
9401022
put_watermarks_quotas_access_pattern_out:
9411023
kobject_put(&scheme->watermarks->kobj);
9421024
scheme->watermarks = NULL;
@@ -956,6 +1038,7 @@ static void damon_sysfs_scheme_rm_dirs(struct damon_sysfs_scheme *scheme)
9561038
damon_sysfs_quotas_rm_dirs(scheme->quotas);
9571039
kobject_put(&scheme->quotas->kobj);
9581040
kobject_put(&scheme->watermarks->kobj);
1041+
kobject_put(&scheme->filters->kobj);
9591042
kobject_put(&scheme->stats->kobj);
9601043
damon_sysfs_scheme_regions_rm_dirs(scheme->tried_regions);
9611044
kobject_put(&scheme->tried_regions->kobj);

0 commit comments

Comments
 (0)