| From: SeongJae Park <sj@kernel.org> |
| Subject: mm/damon/sysfs: move unsigned long range directory to common module |
| Date: Wed, 26 Oct 2022 22:59:39 +0000 |
| |
| The implementation of unsigned long type range directories can be reused |
| by multiple DAMON sysfs directories including those for DAMON-based |
| Operation Schemes and the range of number of monitoring regions. Move the |
| code into the files for DAMON sysfs common logics. |
| |
| Link: https://lkml.kernel.org/r/20221026225943.100429-9-sj@kernel.org |
| Signed-off-by: SeongJae Park <sj@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/damon/sysfs-common.c | 96 ++++++++++++++++++++++++++++++++++++ |
| mm/damon/sysfs-common.h | 13 ++++ |
| mm/damon/sysfs.c | 100 -------------------------------------- |
| 3 files changed, 109 insertions(+), 100 deletions(-) |
| |
| --- a/mm/damon/sysfs.c~mm-damon-sysfs-move-unsigned-long-range-directory-to-common-module |
| +++ a/mm/damon/sysfs.c |
| @@ -12,106 +12,6 @@ |
| #include "sysfs-common.h" |
| |
| /* |
| - * unsigned long range directory |
| - */ |
| - |
| -struct damon_sysfs_ul_range { |
| - struct kobject kobj; |
| - unsigned long min; |
| - unsigned long max; |
| -}; |
| - |
| -static struct damon_sysfs_ul_range *damon_sysfs_ul_range_alloc( |
| - unsigned long min, |
| - unsigned long max) |
| -{ |
| - struct damon_sysfs_ul_range *range = kmalloc(sizeof(*range), |
| - GFP_KERNEL); |
| - |
| - if (!range) |
| - return NULL; |
| - range->kobj = (struct kobject){}; |
| - range->min = min; |
| - range->max = max; |
| - |
| - return range; |
| -} |
| - |
| -static ssize_t min_show(struct kobject *kobj, struct kobj_attribute *attr, |
| - char *buf) |
| -{ |
| - struct damon_sysfs_ul_range *range = container_of(kobj, |
| - struct damon_sysfs_ul_range, kobj); |
| - |
| - return sysfs_emit(buf, "%lu\n", range->min); |
| -} |
| - |
| -static ssize_t min_store(struct kobject *kobj, struct kobj_attribute *attr, |
| - const char *buf, size_t count) |
| -{ |
| - struct damon_sysfs_ul_range *range = container_of(kobj, |
| - struct damon_sysfs_ul_range, kobj); |
| - unsigned long min; |
| - int err; |
| - |
| - err = kstrtoul(buf, 0, &min); |
| - if (err) |
| - return err; |
| - |
| - range->min = min; |
| - return count; |
| -} |
| - |
| -static ssize_t max_show(struct kobject *kobj, struct kobj_attribute *attr, |
| - char *buf) |
| -{ |
| - struct damon_sysfs_ul_range *range = container_of(kobj, |
| - struct damon_sysfs_ul_range, kobj); |
| - |
| - return sysfs_emit(buf, "%lu\n", range->max); |
| -} |
| - |
| -static ssize_t max_store(struct kobject *kobj, struct kobj_attribute *attr, |
| - const char *buf, size_t count) |
| -{ |
| - struct damon_sysfs_ul_range *range = container_of(kobj, |
| - struct damon_sysfs_ul_range, kobj); |
| - unsigned long max; |
| - int err; |
| - |
| - err = kstrtoul(buf, 0, &max); |
| - if (err) |
| - return err; |
| - |
| - range->max = max; |
| - return count; |
| -} |
| - |
| -static void damon_sysfs_ul_range_release(struct kobject *kobj) |
| -{ |
| - kfree(container_of(kobj, struct damon_sysfs_ul_range, kobj)); |
| -} |
| - |
| -static struct kobj_attribute damon_sysfs_ul_range_min_attr = |
| - __ATTR_RW_MODE(min, 0600); |
| - |
| -static struct kobj_attribute damon_sysfs_ul_range_max_attr = |
| - __ATTR_RW_MODE(max, 0600); |
| - |
| -static struct attribute *damon_sysfs_ul_range_attrs[] = { |
| - &damon_sysfs_ul_range_min_attr.attr, |
| - &damon_sysfs_ul_range_max_attr.attr, |
| - NULL, |
| -}; |
| -ATTRIBUTE_GROUPS(damon_sysfs_ul_range); |
| - |
| -static struct kobj_type damon_sysfs_ul_range_ktype = { |
| - .release = damon_sysfs_ul_range_release, |
| - .sysfs_ops = &kobj_sysfs_ops, |
| - .default_groups = damon_sysfs_ul_range_groups, |
| -}; |
| - |
| -/* |
| * schemes/stats directory |
| */ |
| |
| --- a/mm/damon/sysfs-common.c~mm-damon-sysfs-move-unsigned-long-range-directory-to-common-module |
| +++ a/mm/damon/sysfs-common.c |
| @@ -5,7 +5,103 @@ |
| * Author: SeongJae Park <sj@kernel.org> |
| */ |
| |
| +#include <linux/slab.h> |
| + |
| #include "sysfs-common.h" |
| |
| DEFINE_MUTEX(damon_sysfs_lock); |
| |
| +/* |
| + * unsigned long range directory |
| + */ |
| + |
| +struct damon_sysfs_ul_range *damon_sysfs_ul_range_alloc( |
| + unsigned long min, |
| + unsigned long max) |
| +{ |
| + struct damon_sysfs_ul_range *range = kmalloc(sizeof(*range), |
| + GFP_KERNEL); |
| + |
| + if (!range) |
| + return NULL; |
| + range->kobj = (struct kobject){}; |
| + range->min = min; |
| + range->max = max; |
| + |
| + return range; |
| +} |
| + |
| +static ssize_t min_show(struct kobject *kobj, struct kobj_attribute *attr, |
| + char *buf) |
| +{ |
| + struct damon_sysfs_ul_range *range = container_of(kobj, |
| + struct damon_sysfs_ul_range, kobj); |
| + |
| + return sysfs_emit(buf, "%lu\n", range->min); |
| +} |
| + |
| +static ssize_t min_store(struct kobject *kobj, struct kobj_attribute *attr, |
| + const char *buf, size_t count) |
| +{ |
| + struct damon_sysfs_ul_range *range = container_of(kobj, |
| + struct damon_sysfs_ul_range, kobj); |
| + unsigned long min; |
| + int err; |
| + |
| + err = kstrtoul(buf, 0, &min); |
| + if (err) |
| + return err; |
| + |
| + range->min = min; |
| + return count; |
| +} |
| + |
| +static ssize_t max_show(struct kobject *kobj, struct kobj_attribute *attr, |
| + char *buf) |
| +{ |
| + struct damon_sysfs_ul_range *range = container_of(kobj, |
| + struct damon_sysfs_ul_range, kobj); |
| + |
| + return sysfs_emit(buf, "%lu\n", range->max); |
| +} |
| + |
| +static ssize_t max_store(struct kobject *kobj, struct kobj_attribute *attr, |
| + const char *buf, size_t count) |
| +{ |
| + struct damon_sysfs_ul_range *range = container_of(kobj, |
| + struct damon_sysfs_ul_range, kobj); |
| + unsigned long max; |
| + int err; |
| + |
| + err = kstrtoul(buf, 0, &max); |
| + if (err) |
| + return err; |
| + |
| + range->max = max; |
| + return count; |
| +} |
| + |
| +void damon_sysfs_ul_range_release(struct kobject *kobj) |
| +{ |
| + kfree(container_of(kobj, struct damon_sysfs_ul_range, kobj)); |
| +} |
| + |
| +static struct kobj_attribute damon_sysfs_ul_range_min_attr = |
| + __ATTR_RW_MODE(min, 0600); |
| + |
| +static struct kobj_attribute damon_sysfs_ul_range_max_attr = |
| + __ATTR_RW_MODE(max, 0600); |
| + |
| +static struct attribute *damon_sysfs_ul_range_attrs[] = { |
| + &damon_sysfs_ul_range_min_attr.attr, |
| + &damon_sysfs_ul_range_max_attr.attr, |
| + NULL, |
| +}; |
| +ATTRIBUTE_GROUPS(damon_sysfs_ul_range); |
| + |
| +struct kobj_type damon_sysfs_ul_range_ktype = { |
| + .release = damon_sysfs_ul_range_release, |
| + .sysfs_ops = &kobj_sysfs_ops, |
| + .default_groups = damon_sysfs_ul_range_groups, |
| +}; |
| + |
| --- a/mm/damon/sysfs-common.h~mm-damon-sysfs-move-unsigned-long-range-directory-to-common-module |
| +++ a/mm/damon/sysfs-common.h |
| @@ -9,3 +9,16 @@ |
| #include <linux/kobject.h> |
| |
| extern struct mutex damon_sysfs_lock; |
| + |
| +struct damon_sysfs_ul_range { |
| + struct kobject kobj; |
| + unsigned long min; |
| + unsigned long max; |
| +}; |
| + |
| +struct damon_sysfs_ul_range *damon_sysfs_ul_range_alloc( |
| + unsigned long min, |
| + unsigned long max); |
| +void damon_sysfs_ul_range_release(struct kobject *kobj); |
| + |
| +extern struct kobj_type damon_sysfs_ul_range_ktype; |
| _ |