Blame view

include/linux/pid.h 3.38 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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  /*
   * 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.
   *
   * Storing pid_t values in the kernel and refering to them later has a
   * 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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
  struct pid
  {
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
41
  	atomic_t count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
44
  	/* Try to keep pid_chain in the same cacheline as nr for find_pid */
  	int nr;
  	struct hlist_node pid_chain;
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
45
46
47
  	/* lists of tasks that use this pid */
  	struct hlist_head tasks[PIDTYPE_MAX];
  	struct rcu_head rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  };
820e45db2   Sukadev Bhattiprolu   statically initia...
49
  extern struct pid init_struct_pid;
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  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;
  }
  
  extern void FASTCALL(put_pid(struct pid *pid));
  extern struct task_struct *FASTCALL(pid_task(struct pid *pid, enum pid_type));
  extern struct task_struct *FASTCALL(get_pid_task(struct pid *pid,
  						enum pid_type));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67

1a657f78d   Oleg Nesterov   [PATCH] introduce...
68
  extern struct pid *get_task_pid(struct task_struct *task, enum pid_type type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
  /*
   * attach_pid() and detach_pid() must be called with the tasklist_lock
   * write-held.
   */
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
73
  extern int FASTCALL(attach_pid(struct task_struct *task,
e713d0dab   Sukadev Bhattiprolu   attach_pid() with...
74
  				enum pid_type type, struct pid *pid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  extern void FASTCALL(detach_pid(struct task_struct *task, enum pid_type));
c18258c6f   Eric W. Biederman   [PATCH] pid: Impl...
76
77
  extern void FASTCALL(transfer_pid(struct task_struct *old,
  				  struct task_struct *new, enum pid_type));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
  
  /*
   * look up a PID in the hash table. Must be called with the tasklist_lock
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
81
82
83
84
85
86
   * or rcu_read_lock() held.
   */
  extern struct pid *FASTCALL(find_pid(int nr));
  
  /*
   * Lookup a PID in the hash table, and return with it's count elevated.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
   */
92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
88
  extern struct pid *find_get_pid(int nr);
0804ef4b0   Eric W. Biederman   [PATCH] proc: rea...
89
  extern struct pid *find_ge_pid(int nr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90

92476d7fc   Eric W. Biederman   [PATCH] pidhash: ...
91
92
  extern struct pid *alloc_pid(void);
  extern void FASTCALL(free_pid(struct pid *pid));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93

5feb8f5f8   Eric W. Biederman   [PATCH] pid: impl...
94
95
96
97
98
99
100
  static inline pid_t pid_nr(struct pid *pid)
  {
  	pid_t nr = 0;
  	if (pid)
  		nr = pid->nr;
  	return nr;
  }
1d32849b1   Andrew Morton   [PATCH] pid.h cle...
101
102
103
104
105
  #define do_each_pid_task(pid, type, task)				\
  	do {								\
  		struct hlist_node *pos___;				\
  		if (pid != NULL)					\
  			hlist_for_each_entry_rcu((task), pos___,	\
d387cae07   Oleg Nesterov   [PATCH] pid: simp...
106
  				&pid->tasks[type], pids[type].node) {
1d32849b1   Andrew Morton   [PATCH] pid.h cle...
107
108
  #define while_each_pid_task(pid, type, task)				\
  			}						\
d387cae07   Oleg Nesterov   [PATCH] pid: simp...
109
  	} while (0)
558cb3254   Eric W. Biederman   [PATCH] pid: add ...
110

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
  #endif /* _LINUX_PID_H */