[RFC PATCH 11/17] mm/damon/sysfs: implement probe prep directory
From: SJ Park
Date: Sat Jul 25 2026 - 17:06:24 EST
Implement DAMON sysfs directory and files for specifying each probe prep
action. Introduce only preparatory data structure and functions. The
files are not really being created under the sysfs.
Signed-off-by: SJ Park <sj@xxxxxxxxxx>
---
mm/damon/sysfs.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index 6d3ed80fb2eb1..b15ec082109b7 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -750,6 +750,89 @@ static const struct kobj_type damon_sysfs_intervals_ktype = {
.default_groups = damon_sysfs_intervals_groups,
};
+/*
+ * prep directory
+ */
+
+struct damon_sysfs_prep {
+ struct kobject kobj;
+ enum damon_prep_action action;
+};
+
+struct damon_sysfs_prep_action_name {
+ enum damon_prep_action action;
+ 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,
+ struct damon_sysfs_prep, 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);
+
+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
*/
--
2.47.3