Commit 5a8638d6 authored by Lu Jialin's avatar Lu Jialin Committed by Ma Wupeng
Browse files

cgroup: Add cgroup1_get_from_id()

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5ZG61



-------------------------------

Add cgroup1_get_from_id() function to help cgroupv1 get cgroup through
cgroup inode;

The patch also export cgroup_tryget_css(), which will be used later

Signed-off-by: default avatarLu Jialin <lujialin4@huawei.com>
parent 1b709179
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -790,6 +790,8 @@ static inline void cgroup_threadgroup_change_end(struct task_struct *tsk)
	percpu_up_read(&cgroup_threadgroup_rwsem);
}

struct cgroup_subsys_state *cgroup_tryget_css(struct cgroup *cgrp,
					      struct cgroup_subsys *ss);
#else	/* CONFIG_CGROUPS */

#define CGROUP_SUBSYS_COUNT 0
+1 −0
Original line number Diff line number Diff line
@@ -696,6 +696,7 @@ static inline void cgroup_kthread_ready(void)
}

void cgroup_path_from_kernfs_id(u64 id, char *buf, size_t buflen);
struct cgroup *cgroup1_get_from_id(struct cgroup_root *root, u64 id);
#else /* !CONFIG_CGROUPS */

struct cgroup_subsys_state;
+39 −2
Original line number Diff line number Diff line
@@ -475,7 +475,7 @@ static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp,
 * Find and get @cgrp's css assocaited with @ss.  If the css doesn't exist
 * or is offline, %NULL is returned.
 */
static struct cgroup_subsys_state *cgroup_tryget_css(struct cgroup *cgrp,
struct cgroup_subsys_state *cgroup_tryget_css(struct cgroup *cgrp,
					      struct cgroup_subsys *ss)
{
	struct cgroup_subsys_state *css;
@@ -6080,6 +6080,43 @@ int proc_cgroup_show(struct seq_file *m, struct pid_namespace *ns,
	return retval;
}

struct cgroup *cgroup1_get_from_id(struct cgroup_root *root, u64 id)
{
	struct kernfs_node *kn;
	struct cgroup *cgrp, *root_cgrp;

	kn = kernfs_find_and_get_node_by_id(root->kf_root, id);
	if (!kn)
		return ERR_PTR(-ENOENT);

	if (kernfs_type(kn) != KERNFS_DIR) {
		kernfs_put(kn);
		return ERR_PTR(-ENOENT);
	}

	rcu_read_lock();

	cgrp = rcu_dereference(*(void __rcu __force **)&kn->priv);
	if (cgrp && !cgroup_tryget(cgrp))
		cgrp = NULL;

	rcu_read_unlock();
	kernfs_put(kn);

	if (!cgrp)
		return ERR_PTR(-ENOENT);

	spin_lock_irq(&css_set_lock);
	root_cgrp = current_cgns_cgroup_from_root(root);
	spin_unlock_irq(&css_set_lock);
	if (!cgroup_is_descendant(cgrp, root_cgrp)) {
		cgroup_put(cgrp);
		return ERR_PTR(-ENOENT);
	}

	return cgrp;
}

/**
 * cgroup_fork - initialize cgroup related fields during copy_process()
 * @child: pointer to task_struct of forking parent process.