[RFC PATCH v2.2 12/17] mm/damon/sysfs: implement prep_action file

From: SJ Park

Date: Tue Jul 28 2026 - 00:19:23 EST


Add a file named prep_action under the prep directory. It represents
the corresponding probe preparation action.

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

diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index afd39659d6b84..c0130843223d7 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -756,6 +756,7 @@ static const struct kobj_type damon_sysfs_intervals_ktype = {

struct damon_sysfs_prep {
struct kobject kobj;
+ enum damon_prep_action action;
};

static struct damon_sysfs_prep *damon_sysfs_prep_alloc(void)
@@ -765,9 +766,61 @@ static struct damon_sysfs_prep *damon_sysfs_prep_alloc(void)
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 {
+ const enum damon_prep_action action;
+ const char *name;
+};
+
+static const struct damon_sysfs_prep_action_name
+damon_sysfs_prep_action_names[] = {
+ {
+ .action = DAMON_PREP_SET_PGIDLE,
+ .name = "set_pgidle",
+ },
+};
+
+static ssize_t prep_action_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ struct damon_sysfs_prep *prep = container_of(kobj,
+ struct damon_sysfs_prep, kobj);
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(damon_sysfs_prep_action_names); i++) {
+ const struct damon_sysfs_prep_action_name *action_name;
+
+ action_name = &damon_sysfs_prep_action_names[i];
+ if (action_name->action == prep->action)
+ return sysfs_emit(buf, "%s\n", action_name->name);
+ }
+ return -EINVAL;
+}
+
+static ssize_t prep_action_store(struct kobject *kobj,
+ struct kobj_attribute *attr, const char *buf, size_t count)
+{
+ struct damon_sysfs_prep *prep = container_of(kobj,
+ struct damon_sysfs_prep, kobj);
+ ssize_t ret = -EINVAL;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(damon_sysfs_prep_action_names); i++) {
+ const struct damon_sysfs_prep_action_name *action_name;
+
+ action_name = &damon_sysfs_prep_action_names[i];
+ if (sysfs_streq(buf, action_name->name)) {
+ prep->action = action_name->action;
+ ret = count;
+ break;
+ }
+ }
+ return ret;
+}
+
static void damon_sysfs_prep_release(struct kobject *kobj)
{
struct damon_sysfs_prep *prep = container_of(kobj,
@@ -776,7 +829,11 @@ static void damon_sysfs_prep_release(struct kobject *kobj)
kfree(prep);
}

+static struct kobj_attribute damon_sysfs_prep_prep_action_attr =
+ __ATTR_RW_MODE(prep_action, 0600);
+
static struct attribute *damon_sysfs_prep_attrs[] = {
+ &damon_sysfs_prep_prep_action_attr.attr,
NULL,
};
ATTRIBUTE_GROUPS(damon_sysfs_prep);
--
2.47.3