Implement a new sysfs file, nr_producers, under the producers/ directory. The file will be used for generating directories for each report producer, in a manner that is similar to the nr_kdamonds file. Signed-off-by: SJ Park --- mm/damon/sysfs.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 75701ed662222..d3a7cb170975a 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -2983,6 +2983,7 @@ static const struct kobj_type damon_sysfs_kdamonds_ktype = { struct damon_sysfs_producers { struct kobject kobj; + int nr; }; static struct damon_sysfs_producers *damon_sysfs_producers_alloc(void) @@ -2990,12 +2991,62 @@ static struct damon_sysfs_producers *damon_sysfs_producers_alloc(void) return kzalloc_obj(struct damon_sysfs_producers); } +static void damon_sysfs_producers_rm_dirs( + struct damon_sysfs_producers *producers) +{ + producers->nr = 0; +} + +static int damon_sysfs_producers_add_dirs( + struct damon_sysfs_producers *producers, int nr_producers) +{ + damon_sysfs_producers_rm_dirs(producers); + producers->nr = nr_producers; + return 0; +} + +static ssize_t nr_producers_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_producers *producers = container_of(kobj, + struct damon_sysfs_producers, kobj); + + return sysfs_emit(buf, "%d\n", producers->nr); +} + +static ssize_t nr_producers_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_producers *producers; + int nr, err = kstrtoint(buf, 0, &nr); + + if (err) + return err; + if (nr < 0) + return -EINVAL; + + producers = container_of(kobj, struct damon_sysfs_producers, kobj); + + if (!mutex_trylock(&damon_sysfs_lock)) + return -EBUSY; + err = damon_sysfs_producers_add_dirs(producers, nr); + mutex_unlock(&damon_sysfs_lock); + if (err) + return err; + + return count; +} + static void damon_sysfs_producers_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_producers, kobj)); } +static struct kobj_attribute damon_sysfs_producers_nr_attr = +__ATTR_RW_MODE(nr_producers, 0600); + static struct attribute *damon_sysfs_producers_attrs[] = { + &damon_sysfs_producers_nr_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_producers); -- 2.47.3