scsi: cgroup: Add cgroup_get_from_id()
authorMuneendra Kumar <muneendra.kumar@broadcom.com>
Tue, 8 Jun 2021 04:35:44 +0000 (10:05 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 10 Jun 2021 14:01:31 +0000 (10:01 -0400)
Add a new function, cgroup_get_from_id(), to retrieve the cgroup associated
with a cgroup id. Also export the function cgroup_get_e_css() as this is
needed in blk-cgroup.h.

Link: https://lore.kernel.org/r/20210608043556.274139-2-muneendra.kumar@broadcom.com
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Muneendra Kumar <muneendra.kumar@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
include/linux/cgroup.h
kernel/cgroup/cgroup.c

index 4f2f79d..d2eace8 100644 (file)
@@ -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 *cgroup_get_from_id(u64 id);
 #else /* !CONFIG_CGROUPS */
 
 struct cgroup_subsys_state;
@@ -743,6 +744,11 @@ static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
 
 static inline void cgroup_path_from_kernfs_id(u64 id, char *buf, size_t buflen)
 {}
+
+static inline struct cgroup *cgroup_get_from_id(u64 id)
+{
+       return NULL;
+}
 #endif /* !CONFIG_CGROUPS */
 
 #ifdef CONFIG_CGROUPS
index e049edd..692779d 100644 (file)
@@ -577,6 +577,7 @@ out_unlock:
        rcu_read_unlock();
        return css;
 }
+EXPORT_SYMBOL_GPL(cgroup_get_e_css);
 
 static void cgroup_get_live(struct cgroup *cgrp)
 {
@@ -5777,6 +5778,31 @@ void cgroup_path_from_kernfs_id(u64 id, char *buf, size_t buflen)
 }
 
 /*
+ * cgroup_get_from_id : get the cgroup associated with cgroup id
+ * @id: cgroup id
+ * On success return the cgrp, on failure return NULL
+ */
+struct cgroup *cgroup_get_from_id(u64 id)
+{
+       struct kernfs_node *kn;
+       struct cgroup *cgrp = NULL;
+
+       mutex_lock(&cgroup_mutex);
+       kn = kernfs_find_and_get_node_by_id(cgrp_dfl_root.kf_root, id);
+       if (!kn)
+               goto out_unlock;
+
+       cgrp = kn->priv;
+       if (cgroup_is_dead(cgrp) || !cgroup_tryget(cgrp))
+               cgrp = NULL;
+       kernfs_put(kn);
+out_unlock:
+       mutex_unlock(&cgroup_mutex);
+       return cgrp;
+}
+EXPORT_SYMBOL_GPL(cgroup_get_from_id);
+
+/*
  * proc_cgroup_show()
  *  - Print task's cgroup paths into seq_file, one line for each hierarchy
  *  - Used for /proc/<pid>/cgroup.