Commit 102a775e authored by Ben Blum's avatar Ben Blum Committed by Linus Torvalds

cgroups: add a read-only "procs" file similar to "tasks" that shows only unique tgids

struct cgroup used to have a bunch of fields for keeping track of the
pidlist for the tasks file.  Those are now separated into a new struct
cgroup_pidlist, of which two are had, one for procs and one for tasks.
The way the seq_file operations are set up is changed so that just the
pidlist struct gets passed around as the private data.

Interface example: Suppose a multithreaded process has pid 1000 and other
threads with ids 1001, 1002, 1003:
$ cat tasks
1000
1001
1002
1003
$ cat cgroup.procs
1000
$
Signed-off-by: default avatarBen Blum <bblum@google.com>
Signed-off-by: default avatarPaul Menage <menage@google.com>
Acked-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8f3ff208
...@@ -141,6 +141,17 @@ enum { ...@@ -141,6 +141,17 @@ enum {
CGRP_WAIT_ON_RMDIR, CGRP_WAIT_ON_RMDIR,
}; };
struct cgroup_pidlist {
/* protects the other fields */
struct rw_semaphore mutex;
/* 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;
};
struct cgroup { struct cgroup {
unsigned long flags; /* "unsigned long" so bitops work */ unsigned long flags; /* "unsigned long" so bitops work */
...@@ -179,14 +190,9 @@ struct cgroup { ...@@ -179,14 +190,9 @@ struct cgroup {
*/ */
struct list_head release_list; struct list_head release_list;
/* pids_mutex protects the fields below */ /* we will have two separate pidlists, one for pids (the tasks file)
struct rw_semaphore pids_mutex; * and one for tgids (the procs file). */
/* Array of process ids in the cgroup */ struct cgroup_pidlist tasks, procs;
pid_t *tasks_pids;
/* How many files are using the current tasks_pids array */
int pids_use_count;
/* Length of the current tasks_pids array */
int pids_length;
/* For RCU-protected deletion */ /* For RCU-protected deletion */
struct rcu_head rcu_head; struct rcu_head rcu_head;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment