[RFC PATCH v2 12/17] mm/damon/sysfs: create probe prep files for preps/nr file write

From: SJ Park

Date: Sun Jul 26 2026 - 13:40:31 EST


Implement preps/nr file write operation to really create the probe prep
directories and their files.

Signed-off-by: SJ Park <sj@xxxxxxxxxx>
---
mm/damon/sysfs.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 54 insertions(+), 2 deletions(-)

diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index e348c1feed1ad..f275a6f73eee1 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -759,6 +759,17 @@ struct damon_sysfs_prep {
enum damon_prep_action action;
};

+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;
+ prep->action = DAMON_PREP_SET_PGIDLE;
+ return prep;
+}
+
struct damon_sysfs_prep_action_name {
enum damon_prep_action action;
char *name;
@@ -827,7 +838,7 @@ static struct attribute *damon_sysfs_prep_attrs[] = {
};
ATTRIBUTE_GROUPS(damon_sysfs_prep);

-const struct kobj_type damon_sysfs_prep_ktype = {
+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,
@@ -839,6 +850,7 @@ const struct kobj_type damon_sysfs_prep_ktype = {

struct damon_sysfs_preps {
struct kobject kobj;
+ struct damon_sysfs_prep **preps_arr;
int nr;
};

@@ -849,13 +861,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