Re: [RFC PATCH 13/19] mm/damon/sysfs: implement filter dir files

Gutierrez Asier
2026-04-27T13:24:13Z

On 4/26/2026 11:52 PM, SeongJae Park wrote:
> Implement sysfs files under the data probe filter directory for letting
> users to configure each filter.
>
> Signed-off-by: SeongJae Park <sj@kernel.org>
> ---
> mm/damon/sysfs.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 114 insertions(+)
>
> diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
> index 25487a0268cbe..2e0b7eca6bcbf 100644
> --- a/mm/damon/sysfs.c
> +++ b/mm/damon/sysfs.c
> @@ -753,6 +753,9 @@ static const struct kobj_type damon_sysfs_intervals_ktype = {
>
> struct damon_sysfs_filter {
> struct kobject kobj;
> + enum damon_filter_type type;
> + bool matching;
> + bool allow;
> };
>
> static struct damon_sysfs_filter *damon_sysfs_filter_alloc(void)
> @@ -760,6 +763,105 @@ static struct damon_sysfs_filter *damon_sysfs_filter_alloc(void)
> return kzalloc_obj(struct damon_sysfs_filter);
> }
>
> +struct damon_sysfs_filter_type_name {
> + enum damon_filter_type type;
> + char *name;
> +};
> +
> +static const struct damon_sysfs_filter_type_name
> +damon_sysfs_filter_type_names[] = {
> + {
> + .type = DAMON_TEST_TYPE_ANON,
> + .name = "anon",
> + },
> +};
> +
> +static ssize_t type_show(struct kobject *kobj,
> + struct kobj_attribute *attr, char *buf)
> +{
> + struct damon_sysfs_filter *filter = container_of(kobj,
> + struct damon_sysfs_filter, kobj);
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(damon_sysfs_filter_type_names); i++) {
> + const struct damon_sysfs_filter_type_name *type_name;
Can we move this declaration to the top of the function?
> +
> + type_name = &damon_sysfs_filter_type_names[i];
> + if (type_name->type == filter->type)
> + return sysfs_emit(buf, "%s\n", type_name->name);
> + }
> + return -EINVAL;
> +}
> +
> +static ssize_t type_store(struct kobject *kobj,
> + struct kobj_attribute *attr, const char *buf, size_t count)
> +{
> + struct damon_sysfs_filter *filter = container_of(kobj,
> + struct damon_sysfs_filter, kobj);
> + ssize_t ret = -EINVAL;
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(damon_sysfs_filter_type_names); i++) {
> + const struct damon_sysfs_filter_type_name *type_name;
Same
> +
> + type_name = &damon_sysfs_filter_type_names[i];
> + if (sysfs_streq(buf, type_name->name)) {
> + filter->type = type_name->type;
> + ret = count;
> + break;
> + }
> + }
> + return ret;
> +}
> +
> +static ssize_t matching_show(struct kobject *kobj,
> + struct kobj_attribute *attr, char *buf)
> +{
> + struct damon_sysfs_filter *filter = container_of(kobj,
> + struct damon_sysfs_filter, kobj);
> +
> + return sysfs_emit(buf, "%c\n", filter->matching ? 'Y' : 'N');
> +}
> +
> +static ssize_t matching_store(struct kobject *kobj,
> + struct kobj_attribute *attr, const char *buf, size_t count)
> +{
> + struct damon_sysfs_filter *filter = container_of(kobj,
> + struct damon_sysfs_filter, kobj);
> + bool matching;
> + int err = kstrtobool(buf, &matching);
> +
> + if (err)
> + return err;
> +
> + filter->matching = matching;
> + return count;
> +}
> +
> +static ssize_t allow_show(struct kobject *kobj,
> + struct kobj_attribute *attr, char *buf)
> +{
> + struct damon_sysfs_filter *filter = container_of(kobj,
> + struct damon_sysfs_filter, kobj);
> +
> + return sysfs_emit(buf, "%c\n", filter->allow ? 'Y' : 'N');
> +}
> +
> +static ssize_t allow_store(struct kobject *kobj,
> + struct kobj_attribute *attr, const char *buf, size_t count)
> +{
> + struct damon_sysfs_filter *filter = container_of(kobj,
> + struct damon_sysfs_filter, kobj);
> + bool allow;
> + int err = kstrtobool(buf, &allow);
> +
> + if (err)
> + return err;
> +
> + filter->allow = allow;
> + return count;
> +}
> +
> static void damon_sysfs_filter_release(struct kobject *kobj)
> {
> struct damon_sysfs_filter *filter = container_of(kobj,
> @@ -768,7 +870,19 @@ static void damon_sysfs_filter_release(struct kobject *kobj)
> kfree(filter);
> }
>
> +static struct kobj_attribute damon_sysfs_filter_type_attr =
> + __ATTR_RW_MODE(type, 0600);
> +
> +static struct kobj_attribute damon_sysfs_filter_matching_attr =
> + __ATTR_RW_MODE(matching, 0600);
> +
> +static struct kobj_attribute damon_sysfs_filter_allow_attr =
> + __ATTR_RW_MODE(allow, 0600);
> +
> static struct attribute *damon_sysfs_filter_attrs[] = {
> + &damon_sysfs_filter_type_attr.attr,
> + &damon_sysfs_filter_matching_attr.attr,
> + &damon_sysfs_filter_allow_attr.attr,
> NULL,
> };
> ATTRIBUTE_GROUPS(damon_sysfs_filter);

--
Asier Gutierrez
Huawei