Blame view

include/linux/pid.h 5.78 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_PID_H
  #define _LINUX_PID_H
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
3
  #include <linux/rcupdate.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
  enum pid_type
  {
  	PIDTYPE_PID,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
  	PIDTYPE_PGID,
  	PIDTYPE_SID,
  	PIDTYPE_MAX
  };
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
11
12
13
14
15
16
17
18
19
20
  /*
   * What is struct pid?
   *
   * A struct pid is the kernel's internal notion of a process identifier.
   * It refers to individual tasks, process groups, and sessions.  While
   * there are processes attached to it the struct pid lives in a hash
   * table, so it and then the processes that it refers to can be found
   * quickly from the numeric pid value.  The attached processes may be
   * quickly accessed by following pointers from struct pid.
   *
25985edce   Lucas De Marchi   Fix common misspe...
21
   * Storing pid_t values in the kernel and referring to them later has a
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
22
23
24
25
26
27
28
29
30
31
32
33
34
   * problem.  The process originally with that pid may have exited and the
   * pid allocator wrapped, and another process could have come along
   * and been assigned that pid.
   *
   * Referring to user space processes by holding a reference to struct
   * task_struct has a problem.  When the user space process exits
   * the now useless task_struct is still kept.  A task_struct plus a
   * stack consumes around 10K of low kernel memory.  More precisely
   * this is THREAD_SIZE + sizeof(struct task_struct).  By comparison
   * a struct pid is about 64 bytes.
   *
   * Holding a reference to struct pid solves both of these problems.
   * It is small so holding a reference does not consume a lot of
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
35
36
37
   * resources, and since a new struct pid is allocated when the numeric pid
   * value is reused (when pids wrap around) we don't mistakenly refer to new
   * processes.
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
38
   */
4c3f2ead5   Sukadev Bhattiprolu   pid namespaces: i...
39
40
41
42
43
44
45
46
  
  /*
   * struct upid is used to get the id of the struct pid, as it is
   * seen in particular namespace. Later the struct pid is found with
   * find_pid_ns() using the int nr and struct pid_namespace *ns.
   */
  
  struct upid {
e49859e71   Pavel Emelyanov   pidns: remove now...
47
  	/* Try to keep pid_chain in the same cacheline as nr for find_vpid */
4c3f2ead5   Sukadev Bhattiprolu   pid namespaces: i...
48
49
50
51
  	int nr;
  	struct pid_namespace *ns;
  	struct hlist_node pid_chain;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
  struct pid
  {
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
54
  	atomic_t count;
33166b1ff   Richard Kennedy   shrink struct pid...
55
  	unsigned int level;
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
56
57
58
  	/* lists of tasks that use this pid */
  	struct hlist_head tasks[PIDTYPE_MAX];
  	struct rcu_head rcu;
4c3f2ead5   Sukadev Bhattiprolu   pid namespaces: i...
59
  	struct upid numbers[1];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
  };
820e45db2   Sukadev Bhattiprolu   statically initia...
61
  extern struct pid init_struct_pid;
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
62
63
64
65
66
67
68
69
70
71
72
73
  struct pid_link
  {
  	struct hlist_node node;
  	struct pid *pid;
  };
  
  static inline struct pid *get_pid(struct pid *pid)
  {
  	if (pid)
  		atomic_inc(&pid->count);
  	return pid;
  }
b3c975286   Harvey Harrison   include/linux: Re...
74
75
76
  extern void put_pid(struct pid *pid);
  extern struct task_struct *pid_task(struct pid *pid, enum pid_type);
  extern struct task_struct *get_pid_task(struct pid *pid, enum pid_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77

1a657f78d   Oleg Nesterov   [PATCH] introduce...
78
  extern struct pid *get_task_pid(struct task_struct *task, enum pid_type type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
  /*
819077398   Oleg Nesterov   kernel/fork.c:cop...
80
   * these helpers must be called with the tasklist_lock write-held.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
   */
819077398   Oleg Nesterov   kernel/fork.c:cop...
82
  extern void attach_pid(struct task_struct *task, enum pid_type);
b3c975286   Harvey Harrison   include/linux: Re...
83
  extern void detach_pid(struct task_struct *task, enum pid_type);
24336eaee   Oleg Nesterov   pids: introduce c...
84
85
  extern void change_pid(struct task_struct *task, enum pid_type,
  			struct pid *pid);
b3c975286   Harvey Harrison   include/linux: Re...
86
87
  extern void transfer_pid(struct task_struct *old, struct task_struct *new,
  			 enum pid_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88

198fe21b0   Pavel Emelyanov   pid namespaces: h...
89
90
  struct pid_namespace;
  extern struct pid_namespace init_pid_ns;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
  /*
   * look up a PID in the hash table. Must be called with the tasklist_lock
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
93
   * or rcu_read_lock() held.
198fe21b0   Pavel Emelyanov   pid namespaces: h...
94
95
   *
   * find_pid_ns() finds the pid in the namespace specified
26498e89e   Sisir Koppaka   pid: fix typo in ...
96
   * find_vpid() finds the pid by its virtual id, i.e. in the current namespace
198fe21b0   Pavel Emelyanov   pid namespaces: h...
97
   *
dbda0de52   Pavel Emelyanov   pidns: remove fin...
98
   * see also find_task_by_vpid() set in include/linux/sched.h
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
99
   */
b3c975286   Harvey Harrison   include/linux: Re...
100
  extern struct pid *find_pid_ns(int nr, struct pid_namespace *ns);
8990571eb   Pavel Emelyanov   Uninline find_pid...
101
  extern struct pid *find_vpid(int nr);
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
102
103
104
  
  /*
   * Lookup a PID in the hash table, and return with it's count elevated.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
   */
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
106
  extern struct pid *find_get_pid(int nr);
198fe21b0   Pavel Emelyanov   pid namespaces: h...
107
  extern struct pid *find_ge_pid(int nr, struct pid_namespace *);
c78193e9c   Linus Torvalds   next_pidmap: fix ...
108
  int next_pidmap(struct pid_namespace *pid_ns, unsigned int last);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109

8ef047aaa   Pavel Emelyanov   pid namespaces: m...
110
  extern struct pid *alloc_pid(struct pid_namespace *ns);
b3c975286   Harvey Harrison   include/linux: Re...
111
  extern void free_pid(struct pid *pid);
c876ad768   Eric W. Biederman   pidns: Stop pid a...
112
  extern void disable_pid_allocation(struct pid_namespace *ns);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113

7af572947   Pavel Emelyanov   pid namespaces: h...
114
  /*
f9fb860f6   Eric W. Biederman   pid: implement ns...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
   * ns_of_pid() returns the pid namespace in which the specified pid was
   * allocated.
   *
   * NOTE:
   * 	ns_of_pid() is expected to be called for a process (task) that has
   * 	an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid
   * 	is expected to be non-NULL. If @pid is NULL, caller should handle
   * 	the resulting NULL pid-ns.
   */
  static inline struct pid_namespace *ns_of_pid(struct pid *pid)
  {
  	struct pid_namespace *ns = NULL;
  	if (pid)
  		ns = pid->numbers[pid->level].ns;
  	return ns;
  }
  
  /*
45a68628d   Eric W. Biederman   pid: remove the c...
133
134
135
136
137
138
139
140
141
142
143
   * is_child_reaper returns true if the pid is the init process
   * of the current namespace. As this one could be checked before
   * pid_ns->child_reaper is assigned in copy_process, we check
   * with the pid number.
   */
  static inline bool is_child_reaper(struct pid *pid)
  {
  	return pid->numbers[pid->level].nr == 1;
  }
  
  /*
7af572947   Pavel Emelyanov   pid namespaces: h...
144
145
146
   * the helpers to get the pid's id seen from different namespaces
   *
   * pid_nr()    : global id, i.e. the id seen from the init namespace;
44c4e1b25   Eric W. Biederman   pid: Extend/Fix p...
147
148
   * pid_vnr()   : virtual id, i.e. the id seen from the pid namespace of
   *               current.
7af572947   Pavel Emelyanov   pid namespaces: h...
149
150
151
152
   * pid_nr_ns() : id seen from the ns specified.
   *
   * see also task_xid_nr() etc in include/linux/sched.h
   */
5feb8f5f8   Eric W. Biederman   [PATCH] pid: impl...
153
154
155
156
  static inline pid_t pid_nr(struct pid *pid)
  {
  	pid_t nr = 0;
  	if (pid)
7af572947   Pavel Emelyanov   pid namespaces: h...
157
158
159
160
161
  		nr = pid->numbers[0].nr;
  	return nr;
  }
  
  pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);
44c4e1b25   Eric W. Biederman   pid: Extend/Fix p...
162
  pid_t pid_vnr(struct pid *pid);
5feb8f5f8   Eric W. Biederman   [PATCH] pid: impl...
163

1d32849b1   Andrew Morton   [PATCH] pid.h cle...
164
165
  #define do_each_pid_task(pid, type, task)				\
  	do {								\
5ef647619   Steven Rostedt   pid: fix the do_e...
166
  		if ((pid) != NULL)					\
b67bfe0d4   Sasha Levin   hlist: drop the n...
167
  			hlist_for_each_entry_rcu((task),		\
5ef647619   Steven Rostedt   pid: fix the do_e...
168
  				&(pid)->tasks[type], pids[type].node) {
d387cae07   Oleg Nesterov   [PATCH] pid: simp...
169

46f382d2b   Oleg Nesterov   uglify while_each...
170
171
172
173
  			/*
  			 * Both old and new leaders may be attached to
  			 * the same pid in the middle of de_thread().
  			 */
1d32849b1   Andrew Morton   [PATCH] pid.h cle...
174
  #define while_each_pid_task(pid, type, task)				\
46f382d2b   Oleg Nesterov   uglify while_each...
175
176
  				if (type == PIDTYPE_PID)		\
  					break;				\
1d32849b1   Andrew Morton   [PATCH] pid.h cle...
177
  			}						\
d387cae07   Oleg Nesterov   [PATCH] pid: simp...
178
  	} while (0)
558cb3254   Eric W. Biederman   [PATCH] pid: add ...
179

2d70b68d4   Ken Chen   fix setpriority(P...
180
181
182
183
184
185
186
187
188
  #define do_each_pid_thread(pid, type, task)				\
  	do_each_pid_task(pid, type, task) {				\
  		struct task_struct *tg___ = task;			\
  		do {
  
  #define while_each_pid_thread(pid, type, task)				\
  		} while_each_thread(tg___, task);			\
  		task = tg___;						\
  	} while_each_pid_task(pid, type, task)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  #endif /* _LINUX_PID_H */