Blame view
include/linux/pid.h
5.78 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 |
#ifndef _LINUX_PID_H #define _LINUX_PID_H |
92476d7fc [PATCH] pidhash: ... |
3 |
#include <linux/rcupdate.h> |
1da177e4c Linux-2.6.12-rc2 |
4 5 6 |
enum pid_type { PIDTYPE_PID, |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 |
PIDTYPE_PGID, PIDTYPE_SID, PIDTYPE_MAX }; |
92476d7fc [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 Fix common misspe... |
21 |
* Storing pid_t values in the kernel and referring to them later has a |
92476d7fc [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 [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 [PATCH] pidhash: ... |
38 |
*/ |
4c3f2ead5 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 pidns: remove now... |
47 |
/* Try to keep pid_chain in the same cacheline as nr for find_vpid */ |
4c3f2ead5 pid namespaces: i... |
48 49 50 51 |
int nr; struct pid_namespace *ns; struct hlist_node pid_chain; }; |
1da177e4c Linux-2.6.12-rc2 |
52 53 |
struct pid { |
92476d7fc [PATCH] pidhash: ... |
54 |
atomic_t count; |
33166b1ff shrink struct pid... |
55 |
unsigned int level; |
92476d7fc [PATCH] pidhash: ... |
56 57 58 |
/* lists of tasks that use this pid */ struct hlist_head tasks[PIDTYPE_MAX]; struct rcu_head rcu; |
4c3f2ead5 pid namespaces: i... |
59 |
struct upid numbers[1]; |
1da177e4c Linux-2.6.12-rc2 |
60 |
}; |
820e45db2 statically initia... |
61 |
extern struct pid init_struct_pid; |
92476d7fc [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 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 Linux-2.6.12-rc2 |
77 |
|
1a657f78d [PATCH] introduce... |
78 |
extern struct pid *get_task_pid(struct task_struct *task, enum pid_type type); |
1da177e4c Linux-2.6.12-rc2 |
79 |
/* |
819077398 kernel/fork.c:cop... |
80 |
* these helpers must be called with the tasklist_lock write-held. |
1da177e4c Linux-2.6.12-rc2 |
81 |
*/ |
819077398 kernel/fork.c:cop... |
82 |
extern void attach_pid(struct task_struct *task, enum pid_type); |
b3c975286 include/linux: Re... |
83 |
extern void detach_pid(struct task_struct *task, enum pid_type); |
24336eaee pids: introduce c... |
84 85 |
extern void change_pid(struct task_struct *task, enum pid_type, struct pid *pid); |
b3c975286 include/linux: Re... |
86 87 |
extern void transfer_pid(struct task_struct *old, struct task_struct *new, enum pid_type); |
1da177e4c Linux-2.6.12-rc2 |
88 |
|
198fe21b0 pid namespaces: h... |
89 90 |
struct pid_namespace; extern struct pid_namespace init_pid_ns; |
1da177e4c Linux-2.6.12-rc2 |
91 92 |
/* * look up a PID in the hash table. Must be called with the tasklist_lock |
92476d7fc [PATCH] pidhash: ... |
93 |
* or rcu_read_lock() held. |
198fe21b0 pid namespaces: h... |
94 95 |
* * find_pid_ns() finds the pid in the namespace specified |
26498e89e pid: fix typo in ... |
96 |
* find_vpid() finds the pid by its virtual id, i.e. in the current namespace |
198fe21b0 pid namespaces: h... |
97 |
* |
dbda0de52 pidns: remove fin... |
98 |
* see also find_task_by_vpid() set in include/linux/sched.h |
92476d7fc [PATCH] pidhash: ... |
99 |
*/ |
b3c975286 include/linux: Re... |
100 |
extern struct pid *find_pid_ns(int nr, struct pid_namespace *ns); |
8990571eb Uninline find_pid... |
101 |
extern struct pid *find_vpid(int nr); |
92476d7fc [PATCH] pidhash: ... |
102 103 104 |
/* * Lookup a PID in the hash table, and return with it's count elevated. |
1da177e4c Linux-2.6.12-rc2 |
105 |
*/ |
92476d7fc [PATCH] pidhash: ... |
106 |
extern struct pid *find_get_pid(int nr); |
198fe21b0 pid namespaces: h... |
107 |
extern struct pid *find_ge_pid(int nr, struct pid_namespace *); |
c78193e9c next_pidmap: fix ... |
108 |
int next_pidmap(struct pid_namespace *pid_ns, unsigned int last); |
1da177e4c Linux-2.6.12-rc2 |
109 |
|
8ef047aaa pid namespaces: m... |
110 |
extern struct pid *alloc_pid(struct pid_namespace *ns); |
b3c975286 include/linux: Re... |
111 |
extern void free_pid(struct pid *pid); |
c876ad768 pidns: Stop pid a... |
112 |
extern void disable_pid_allocation(struct pid_namespace *ns); |
1da177e4c Linux-2.6.12-rc2 |
113 |
|
7af572947 pid namespaces: h... |
114 |
/* |
f9fb860f6 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 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 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 pid: Extend/Fix p... |
147 148 |
* pid_vnr() : virtual id, i.e. the id seen from the pid namespace of * current. |
7af572947 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 [PATCH] pid: impl... |
153 154 155 156 |
static inline pid_t pid_nr(struct pid *pid) { pid_t nr = 0; if (pid) |
7af572947 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 pid: Extend/Fix p... |
162 |
pid_t pid_vnr(struct pid *pid); |
5feb8f5f8 [PATCH] pid: impl... |
163 |
|
1d32849b1 [PATCH] pid.h cle... |
164 165 |
#define do_each_pid_task(pid, type, task) \ do { \ |
5ef647619 pid: fix the do_e... |
166 |
if ((pid) != NULL) \ |
b67bfe0d4 hlist: drop the n... |
167 |
hlist_for_each_entry_rcu((task), \ |
5ef647619 pid: fix the do_e... |
168 |
&(pid)->tasks[type], pids[type].node) { |
d387cae07 [PATCH] pid: simp... |
169 |
|
46f382d2b 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 [PATCH] pid.h cle... |
174 |
#define while_each_pid_task(pid, type, task) \ |
46f382d2b uglify while_each... |
175 176 |
if (type == PIDTYPE_PID) \ break; \ |
1d32849b1 [PATCH] pid.h cle... |
177 |
} \ |
d387cae07 [PATCH] pid: simp... |
178 |
} while (0) |
558cb3254 [PATCH] pid: add ... |
179 |
|
2d70b68d4 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 Linux-2.6.12-rc2 |
189 |
#endif /* _LINUX_PID_H */ |