|
@@ -3043,6 +3043,38 @@ int cgroup_scan_tasks(struct cgroup_scanner *scan)
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
+/* which pidlist file are we talking about? */
|
|
|
+enum cgroup_filetype {
|
|
|
+ CGROUP_FILE_PROCS,
|
|
|
+ CGROUP_FILE_TASKS,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * A pidlist is a list of pids that virtually represents the contents of one
|
|
|
+ * of the cgroup files ("procs" or "tasks"). We keep a list of such pidlists,
|
|
|
+ * a pair (one each for procs, tasks) for each pid namespace that's relevant
|
|
|
+ * to the cgroup.
|
|
|
+ */
|
|
|
+struct cgroup_pidlist {
|
|
|
+ /*
|
|
|
+ * used to find which pidlist is wanted. doesn't change as long as
|
|
|
+ * this particular list stays in the list.
|
|
|
+ */
|
|
|
+ struct { enum cgroup_filetype type; struct pid_namespace *ns; } key;
|
|
|
+ /* array of xids */
|
|
|
+ pid_t *list;
|
|
|
+ /* how many elements the above list has */
|
|
|
+ int length;
|
|
|
+ /* how many files are using the current array */
|
|
|
+ int use_count;
|
|
|
+ /* each of these stored in a list by its cgroup */
|
|
|
+ struct list_head links;
|
|
|
+ /* pointer to the cgroup we belong to, for list removal purposes */
|
|
|
+ struct cgroup *owner;
|
|
|
+ /* protects the other fields */
|
|
|
+ struct rw_semaphore mutex;
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* The following two functions "fix" the issue where there are more pids
|
|
|
* than kmalloc will give memory for; in such cases, we use vmalloc/vfree.
|