Commit c41e253a authored by SeongJae Park's avatar SeongJae Park Committed by Andrew Morton
Browse files

mm/damon/sysfs-schemes: implement path file under quota goal directory

Add a DAMOS sysfs file for specifying the cgroup of the interest for
DAMOS_QUOTA_NODE_MEMCG_USED_BP.

Link: https://lkml.kernel.org/r/20251017212706.183502-5-sj@kernel.org


Signed-off-by: default avatarSeongJae Park <sj@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent b74a120b
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -999,6 +999,7 @@ struct damos_sysfs_quota_goal {
	unsigned long target_value;
	unsigned long current_value;
	int nid;
	char *path;
};

static struct damos_sysfs_quota_goal *damos_sysfs_quota_goal_alloc(void)
@@ -1128,10 +1129,39 @@ static ssize_t nid_store(struct kobject *kobj,
	return err ? err : count;
}

static ssize_t path_show(struct kobject *kobj,
		struct kobj_attribute *attr, char *buf)
{
	struct damos_sysfs_quota_goal *goal = container_of(kobj,
			struct damos_sysfs_quota_goal, kobj);

	return sysfs_emit(buf, "%s\n", goal->path ? goal->path : "");
}

static ssize_t path_store(struct kobject *kobj,
		struct kobj_attribute *attr, const char *buf, size_t count)
{
	struct damos_sysfs_quota_goal *goal = container_of(kobj,
			struct damos_sysfs_quota_goal, kobj);
	char *path = kmalloc_array(size_add(count, 1), sizeof(*path),
				   GFP_KERNEL);

	if (!path)
		return -ENOMEM;

	strscpy(path, buf, count + 1);
	kfree(goal->path);
	goal->path = path;
	return count;
}

static void damos_sysfs_quota_goal_release(struct kobject *kobj)
{
	/* or, notify this release to the feed callback */
	kfree(container_of(kobj, struct damos_sysfs_quota_goal, kobj));
	struct damos_sysfs_quota_goal *goal = container_of(kobj,
			struct damos_sysfs_quota_goal, kobj);

	kfree(goal->path);
	kfree(goal);
}

static struct kobj_attribute damos_sysfs_quota_goal_target_metric_attr =
@@ -1146,11 +1176,15 @@ static struct kobj_attribute damos_sysfs_quota_goal_current_value_attr =
static struct kobj_attribute damos_sysfs_quota_goal_nid_attr =
		__ATTR_RW_MODE(nid, 0600);

static struct kobj_attribute damos_sysfs_quota_goal_path_attr =
		__ATTR_RW_MODE(path, 0600);

static struct attribute *damos_sysfs_quota_goal_attrs[] = {
	&damos_sysfs_quota_goal_target_metric_attr.attr,
	&damos_sysfs_quota_goal_target_value_attr.attr,
	&damos_sysfs_quota_goal_current_value_attr.attr,
	&damos_sysfs_quota_goal_nid_attr.attr,
	&damos_sysfs_quota_goal_path_attr.attr,
	NULL,
};
ATTRIBUTE_GROUPS(damos_sysfs_quota_goal);