[RFC PATCH v2.1 11/17] mm/damon/sysfs: create directories for nr_preps writes
From: SJ Park
Date: Mon Jul 27 2026 - 10:46:53 EST
Implement nr_preps write action to actually create subdirectories of the
number. Each of the directory will be evolved to represent each probe
preparation action.
Signed-off-by: SJ Park <sj@xxxxxxxxxx>
---
mm/damon/sysfs.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 79 insertions(+), 1 deletion(-)
diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index 6d3ed80fb2eb1..2ec33280a7a83 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -750,12 +750,50 @@ static const struct kobj_type damon_sysfs_intervals_ktype = {
.default_groups = damon_sysfs_intervals_groups,
};
+/*
+ * prep directory
+ */
+
+struct damon_sysfs_prep {
+ struct kobject kobj;
+};
+
+static struct damon_sysfs_prep *damon_sysfs_prep_alloc(void)
+{
+ struct damon_sysfs_prep *prep;
+
+ prep = kzalloc_obj(struct damon_sysfs_prep);
+ if (!prep)
+ return prep;
+ return prep;
+}
+
+static void damon_sysfs_prep_release(struct kobject *kobj)
+{
+ struct damon_sysfs_prep *prep = container_of(kobj,
+ struct damon_sysfs_prep, kobj);
+
+ kfree(prep);
+}
+
+static struct attribute *damon_sysfs_prep_attrs[] = {
+ NULL,
+};
+ATTRIBUTE_GROUPS(damon_sysfs_prep);
+
+static const struct kobj_type damon_sysfs_prep_ktype = {
+ .release = damon_sysfs_prep_release,
+ .sysfs_ops = &kobj_sysfs_ops,
+ .default_groups = damon_sysfs_prep_groups,
+};
+
/*
* preps directory
*/
struct damon_sysfs_preps {
struct kobject kobj;
+ struct damon_sysfs_prep **preps_arr;
int nr;
};
@@ -766,13 +804,53 @@ static struct damon_sysfs_preps *damon_sysfs_preps_alloc(void)
static void damon_sysfs_preps_rm_dirs(struct damon_sysfs_preps *preps)
{
+ struct damon_sysfs_prep **preps_arr = preps->preps_arr;
+ int i;
+
+ for (i = 0; i < preps->nr; i++) {
+ kobject_del(&preps_arr[i]->kobj);
+ kobject_put(&preps_arr[i]->kobj);
+ }
preps->nr = 0;
+ kfree(preps_arr);
+ preps->preps_arr = NULL;
}
static int damon_sysfs_preps_add_dirs(struct damon_sysfs_preps *preps,
int nr_preps)
{
- preps->nr = nr_preps;
+ struct damon_sysfs_prep **preps_arr, *prep;
+ int err, i;
+
+ damon_sysfs_preps_rm_dirs(preps);
+ if (!nr_preps)
+ return 0;
+
+ preps_arr = kmalloc_objs(*preps_arr, nr_preps,
+ GFP_KERNEL | __GFP_NOWARN);
+ if (!preps_arr)
+ return -ENOMEM;
+ preps->preps_arr = preps_arr;
+
+ for (i = 0; i < nr_preps; i++) {
+ prep = damon_sysfs_prep_alloc();
+ if (!prep) {
+ damon_sysfs_preps_rm_dirs(preps);
+ return -ENOMEM;
+ }
+
+ err = kobject_init_and_add(&prep->kobj,
+ &damon_sysfs_prep_ktype, &preps->kobj, "%d",
+ i);
+ if (err) {
+ kobject_put(&prep->kobj);
+ damon_sysfs_preps_rm_dirs(preps);
+ return err;
+ }
+
+ preps_arr[i] = prep;
+ preps->nr++;
+ }
return 0;
}
--
2.47.3