Implement addr_start and addr_end sysfs files under report producer directory. Those set and get the address range of the user_report type data attribute reports. Signed-off-by: SJ Park --- mm/damon/sysfs.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index b4d898ec0c9f7..5f9bb1955dfd5 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -3047,6 +3047,7 @@ struct damon_sysfs_producer { struct kobject kobj; enum damon_report_type report_type; bool enabled; + struct damon_addr_range addr_range; }; static struct damon_sysfs_producer *damon_sysfs_producer_alloc(void) @@ -3116,6 +3117,44 @@ static ssize_t producer_state_store(struct kobject *kobj, return count; } +static ssize_t addr_start_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_producer *producer = container_of(kobj, + struct damon_sysfs_producer, kobj); + + return sysfs_emit(buf, "%lu\n", producer->addr_range.start); +} + +static ssize_t addr_start_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_producer *producer = container_of(kobj, + struct damon_sysfs_producer, kobj); + int err = kstrtoul(buf, 0, &producer->addr_range.start); + + return err ? err : count; +} + +static ssize_t addr_end_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_producer *producer = container_of(kobj, + struct damon_sysfs_producer, kobj); + + return sysfs_emit(buf, "%lu\n", producer->addr_range.end); +} + +static ssize_t addr_end_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_producer *producer = container_of(kobj, + struct damon_sysfs_producer, kobj); + int err = kstrtoul(buf, 0, &producer->addr_range.end); + + return err ? err : count; +} + static void damon_sysfs_producer_release(struct kobject *kobj) { struct damon_sysfs_producer *producer = container_of(kobj, @@ -3127,10 +3166,16 @@ static struct kobj_attribute damon_sysfs_producer_report_type_attr = __ATTR_RW_MODE(report_type, 0600); static struct kobj_attribute damon_sysfs_producer_producer_state_type_attr = __ATTR_RW_MODE(producer_state, 0600); +static struct kobj_attribute damon_sysfs_producer_addr_start_type_attr = + __ATTR_RW_MODE(addr_start, 0600); +static struct kobj_attribute damon_sysfs_producer_addr_end_type_attr = + __ATTR_RW_MODE(addr_end, 0600); static struct attribute *damon_sysfs_producer_attrs[] = { &damon_sysfs_producer_report_type_attr.attr, &damon_sysfs_producer_producer_state_type_attr.attr, + &damon_sysfs_producer_addr_start_type_attr.attr, + &damon_sysfs_producer_addr_end_type_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_producer); -- 2.47.3