Blame view

kernel/exit.c 44.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  /*
   *  linux/kernel/exit.c
   *
   *  Copyright (C) 1991, 1992  Linus Torvalds
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
  #include <linux/mm.h>
  #include <linux/slab.h>
  #include <linux/interrupt.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
  #include <linux/module.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
10
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
  #include <linux/completion.h>
  #include <linux/personality.h>
  #include <linux/tty.h>
da9cbc873   Jens Axboe   block: blkdev.h c...
14
  #include <linux/iocontext.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
  #include <linux/key.h>
  #include <linux/security.h>
  #include <linux/cpu.h>
  #include <linux/acct.h>
8f0ab5147   Jay Lan   [PATCH] csa: conv...
19
  #include <linux/tsacct_kern.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  #include <linux/file.h>
9f3acc314   Al Viro   [PATCH] split lin...
21
  #include <linux/fdtable.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  #include <linux/binfmts.h>
ab516013a   Serge E. Hallyn   [PATCH] namespace...
23
  #include <linux/nsproxy.h>
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
24
  #include <linux/pid_namespace.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
  #include <linux/ptrace.h>
  #include <linux/profile.h>
  #include <linux/mount.h>
  #include <linux/proc_fs.h>
49d769d52   Eric W. Biederman   Change reparent_t...
29
  #include <linux/kthread.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #include <linux/mempolicy.h>
c757249af   Shailabh Nagar   [PATCH] per-task-...
31
  #include <linux/taskstats_kern.h>
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
32
  #include <linux/delayacct.h>
831441862   Rafael J. Wysocki   Freezer: make ker...
33
  #include <linux/freezer.h>
b4f48b636   Paul Menage   Task Control Grou...
34
  #include <linux/cgroup.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  #include <linux/syscalls.h>
7ed20e1ad   Jesper Juhl   [PATCH] convert t...
36
  #include <linux/signal.h>
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
37
  #include <linux/posix-timers.h>
9f46080c4   Matt Helsley   [PATCH] Process E...
38
  #include <linux/cn_proc.h>
de5097c2e   Ingo Molnar   [PATCH] mutex sub...
39
  #include <linux/mutex.h>
0771dfefc   Ingo Molnar   [PATCH] lightweig...
40
  #include <linux/futex.h>
b92ce5589   Jens Axboe   [PATCH] splice: a...
41
  #include <linux/pipe_fs_i.h>
fa84cb935   Al Viro   [PATCH] move call...
42
  #include <linux/audit.h> /* for audit_free() */
83cc5ed3c   Adrian Bunk   [PATCH] kernel/sy...
43
  #include <linux/resource.h>
0d67a46df   David Howells   [PATCH] BLOCK: Re...
44
  #include <linux/blkdev.h>
6eaeeaba3   Eric Dumazet   getrusage(): fill...
45
  #include <linux/task_io_accounting_ops.h>
30199f5a4   Roland McGrath   tracehook: exit
46
  #include <linux/tracehook.h>
5ad4e53bd   Al Viro   Get rid of indire...
47
  #include <linux/fs_struct.h>
d84f4f992   David Howells   CRED: Inaugurate ...
48
  #include <linux/init_task.h>
cdd6c482c   Ingo Molnar   perf: Do the big ...
49
  #include <linux/perf_event.h>
ad8d75fff   Steven Rostedt   tracing/events: m...
50
  #include <trace/events/sched.h>
24f1e32c6   Frederic Weisbecker   hw-breakpoints: R...
51
  #include <linux/hw_breakpoint.h>
3d5992d2a   Ying Han   oom: add per-mm o...
52
  #include <linux/oom.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
55
56
57
  
  #include <asm/uaccess.h>
  #include <asm/unistd.h>
  #include <asm/pgtable.h>
  #include <asm/mmu_context.h>
408b664a7   Adrian Bunk   [PATCH] make lots...
58
  static void exit_mm(struct task_struct * tsk);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
59
  static void __unhash_process(struct task_struct *p, bool group_dead)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
  {
  	nr_threads--;
  	detach_pid(p, PIDTYPE_PID);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
63
  	if (group_dead) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
65
  		detach_pid(p, PIDTYPE_PGID);
  		detach_pid(p, PIDTYPE_SID);
c97d98931   Oleg Nesterov   [PATCH] kill SET_...
66

5e85d4abe   Eric W. Biederman   [PATCH] task: Mak...
67
  		list_del_rcu(&p->tasks);
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
68
  		list_del_init(&p->sibling);
909ea9646   Christoph Lameter   core: Replace __g...
69
  		__this_cpu_dec(process_counts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  	}
47e65328a   Oleg Nesterov   [PATCH] pids: kil...
71
  	list_del_rcu(&p->thread_group);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
  }
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
73
74
75
76
77
78
  /*
   * This function expects the tasklist_lock write-locked.
   */
  static void __exit_signal(struct task_struct *tsk)
  {
  	struct signal_struct *sig = tsk->signal;
d40e48e02   Oleg Nesterov   exit: __exit_sign...
79
  	bool group_dead = thread_group_leader(tsk);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
80
  	struct sighand_struct *sighand;
4ada856fb   Oleg Nesterov   signals: clear si...
81
  	struct tty_struct *uninitialized_var(tty);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
82

d11c563dd   Paul E. McKenney   sched: Use lockde...
83
84
  	sighand = rcu_dereference_check(tsk->sighand,
  					rcu_read_lock_held() ||
db1466b3e   Paul E. McKenney   rcu: Use wrapper ...
85
  					lockdep_tasklist_lock_is_held());
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
86
87
88
  	spin_lock(&sighand->siglock);
  
  	posix_cpu_timers_exit(tsk);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
89
  	if (group_dead) {
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
90
  		posix_cpu_timers_exit_group(tsk);
4ada856fb   Oleg Nesterov   signals: clear si...
91
92
  		tty = sig->tty;
  		sig->tty = NULL;
4a5999429   Oleg Nesterov   exit: avoid sig->...
93
  	} else {
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
94
  		/*
e0a702171   Oleg Nesterov   posix-cpu-timers:...
95
96
97
98
99
100
101
102
  		 * This can only happen if the caller is de_thread().
  		 * FIXME: this is the temporary hack, we should teach
  		 * posix-cpu-timers to handle this case correctly.
  		 */
  		if (unlikely(has_group_leader_pid(tsk)))
  			posix_cpu_timers_exit_group(tsk);
  
  		/*
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
103
104
105
  		 * If there is any task waiting for the group exit
  		 * then notify it:
  		 */
d344193a0   Oleg Nesterov   exit: avoid sig->...
106
  		if (sig->notify_count > 0 && !--sig->notify_count)
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
107
  			wake_up_process(sig->group_exit_task);
6db840fa7   Oleg Nesterov   exec: RT sub-thre...
108

6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
109
110
111
112
113
114
115
116
117
118
119
120
  		if (tsk == sig->curr_target)
  			sig->curr_target = next_thread(tsk);
  		/*
  		 * Accumulate here the counters for all threads but the
  		 * group leader as they die, so they can be added into
  		 * the process-wide totals when those are taken.
  		 * The group leader stays around as a zombie as long
  		 * as there are other threads.  When it gets reaped,
  		 * the exit.c code will add its counts into these totals.
  		 * We won't ever get here for the group leader, since it
  		 * will have been the last reference on the signal_struct.
  		 */
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
121
122
  		sig->utime = cputime_add(sig->utime, tsk->utime);
  		sig->stime = cputime_add(sig->stime, tsk->stime);
d5b7c78e9   Hidetoshi Seto   sched: Remove tas...
123
  		sig->gtime = cputime_add(sig->gtime, tsk->gtime);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
124
125
126
127
  		sig->min_flt += tsk->min_flt;
  		sig->maj_flt += tsk->maj_flt;
  		sig->nvcsw += tsk->nvcsw;
  		sig->nivcsw += tsk->nivcsw;
6eaeeaba3   Eric Dumazet   getrusage(): fill...
128
129
  		sig->inblock += task_io_get_inblock(tsk);
  		sig->oublock += task_io_get_oublock(tsk);
5995477ab   Andrea Righi   task IO accountin...
130
  		task_io_accounting_add(&sig->ioac, &tsk->ioac);
32bd671d6   Peter Zijlstra   signal: re-add de...
131
  		sig->sum_sched_runtime += tsk->se.sum_exec_runtime;
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
132
  	}
b3ac022cb   Oleg Nesterov   proc: turn signal...
133
  	sig->nr_threads--;
d40e48e02   Oleg Nesterov   exit: __exit_sign...
134
  	__unhash_process(tsk, group_dead);
5876700cd   Oleg Nesterov   [PATCH] do __unha...
135

da7978b03   Oleg Nesterov   signals: fix sigq...
136
137
138
139
140
  	/*
  	 * Do this under ->siglock, we can race with another thread
  	 * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals.
  	 */
  	flush_sigqueue(&tsk->pending);
a7e5328a0   Oleg Nesterov   [PATCH] cleanup _...
141
  	tsk->sighand = NULL;
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
142
  	spin_unlock(&sighand->siglock);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
143

a7e5328a0   Oleg Nesterov   [PATCH] cleanup _...
144
  	__cleanup_sighand(sighand);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
145
  	clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
146
  	if (group_dead) {
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
147
  		flush_sigqueue(&sig->shared_pending);
4ada856fb   Oleg Nesterov   signals: clear si...
148
  		tty_kref_put(tty);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
149
150
  	}
  }
8c7904a00   Eric W. Biederman   [PATCH] task: RCU...
151
152
  static void delayed_put_task_struct(struct rcu_head *rhp)
  {
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
153
  	struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
4e231c796   Peter Zijlstra   perf: Fix up dela...
154
  	perf_event_delayed_put(tsk);
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
155
156
  	trace_sched_process_free(tsk);
  	put_task_struct(tsk);
8c7904a00   Eric W. Biederman   [PATCH] task: RCU...
157
  }
f470021ad   Roland McGrath   ptrace children r...
158

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
160
  void release_task(struct task_struct * p)
  {
36c8b5868   Ingo Molnar   [PATCH] sched: cl...
161
  	struct task_struct *leader;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
  	int zap_leader;
1f09f9749   Oleg Nesterov   [PATCH] release_t...
163
  repeat:
dae33574d   Roland McGrath   tracehook: releas...
164
  	tracehook_prepare_release_task(p);
c69e8d9c0   David Howells   CRED: Use RCU to ...
165
  	/* don't need to get the RCU readlock here - the process is dead and
d11c563dd   Paul E. McKenney   sched: Use lockde...
166
167
  	 * can't be modifying its own credentials. But shut RCU-lockdep up */
  	rcu_read_lock();
c69e8d9c0   David Howells   CRED: Use RCU to ...
168
  	atomic_dec(&__task_cred(p)->user->processes);
d11c563dd   Paul E. McKenney   sched: Use lockde...
169
  	rcu_read_unlock();
c69e8d9c0   David Howells   CRED: Use RCU to ...
170

60347f671   Pavel Emelyanov   pid namespaces: p...
171
  	proc_flush_task(p);
0203026b5   Ingo Molnar   perf_counter: fix...
172

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
  	write_lock_irq(&tasklist_lock);
dae33574d   Roland McGrath   tracehook: releas...
174
  	tracehook_finish_release_task(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  	__exit_signal(p);
35f5cad8c   Oleg Nesterov   [PATCH] revert "O...
176

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
181
182
183
184
  	/*
  	 * If we are the last non-leader member of the thread
  	 * group, and the leader is zombie, then notify the
  	 * group leader's parent process. (if it wants notification.)
  	 */
  	zap_leader = 0;
  	leader = p->group_leader;
  	if (leader != p && thread_group_empty(leader) && leader->exit_state == EXIT_ZOMBIE) {
d839fd4d2   Oleg Nesterov   ptrace: introduce...
185
  		BUG_ON(task_detached(leader));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
190
191
192
193
194
  		do_notify_parent(leader, leader->exit_signal);
  		/*
  		 * If we were the last child thread and the leader has
  		 * exited already, and the leader's parent ignores SIGCHLD,
  		 * then we are the one who should release the leader.
  		 *
  		 * do_notify_parent() will have marked it self-reaping in
  		 * that case.
  		 */
d839fd4d2   Oleg Nesterov   ptrace: introduce...
195
  		zap_leader = task_detached(leader);
dae33574d   Roland McGrath   tracehook: releas...
196
197
198
199
200
201
202
  
  		/*
  		 * This maintains the invariant that release_task()
  		 * only runs on a task in EXIT_DEAD, just for sanity.
  		 */
  		if (zap_leader)
  			leader->exit_state = EXIT_DEAD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  	write_unlock_irq(&tasklist_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  	release_thread(p);
8c7904a00   Eric W. Biederman   [PATCH] task: RCU...
206
  	call_rcu(&p->rcu, delayed_put_task_struct);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
209
210
211
  
  	p = leader;
  	if (unlikely(zap_leader))
  		goto repeat;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
214
215
  /*
   * This checks not only the pgrp, but falls back on the pid if no
   * satisfactory pgrp is found. I dunno - gdb doesn't work correctly
   * without this...
04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
216
217
   *
   * The caller must hold rcu lock or the tasklist lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
   */
04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
219
  struct pid *session_of_pgrp(struct pid *pgrp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
221
  {
  	struct task_struct *p;
04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
222
  	struct pid *sid = NULL;
62dfb5541   Oleg Nesterov   [PATCH] session_o...
223

04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
224
  	p = pid_task(pgrp, PIDTYPE_PGID);
62dfb5541   Oleg Nesterov   [PATCH] session_o...
225
  	if (p == NULL)
04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
226
  		p = pid_task(pgrp, PIDTYPE_PID);
62dfb5541   Oleg Nesterov   [PATCH] session_o...
227
  	if (p != NULL)
04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
228
  		sid = task_session(p);
62dfb5541   Oleg Nesterov   [PATCH] session_o...
229

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
231
232
233
234
235
236
237
238
239
240
  	return sid;
  }
  
  /*
   * Determine if a process group is "orphaned", according to the POSIX
   * definition in 2.2.2.52.  Orphaned process groups are not to be affected
   * by terminal-generated stop signals.  Newly orphaned process groups are
   * to receive a SIGHUP and a SIGCONT.
   *
   * "I ask you, have you ever known what it is to be an orphan?"
   */
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
241
  static int will_become_orphaned_pgrp(struct pid *pgrp, struct task_struct *ignored_task)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
  {
  	struct task_struct *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244

0475ac084   Eric W. Biederman   [PATCH] pid: use ...
245
  	do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
05e83df62   Oleg Nesterov   will_become_orpha...
246
247
248
  		if ((p == ignored_task) ||
  		    (p->exit_state && thread_group_empty(p)) ||
  		    is_global_init(p->real_parent))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
  			continue;
05e83df62   Oleg Nesterov   will_become_orpha...
250

0475ac084   Eric W. Biederman   [PATCH] pid: use ...
251
  		if (task_pgrp(p->real_parent) != pgrp &&
05e83df62   Oleg Nesterov   will_become_orpha...
252
253
  		    task_session(p->real_parent) == task_session(p))
  			return 0;
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
254
  	} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
05e83df62   Oleg Nesterov   will_become_orpha...
255
256
  
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
  }
3e7cd6c41   Eric W. Biederman   [PATCH] pid: repl...
258
  int is_current_pgrp_orphaned(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
260
261
262
  {
  	int retval;
  
  	read_lock(&tasklist_lock);
3e7cd6c41   Eric W. Biederman   [PATCH] pid: repl...
263
  	retval = will_become_orphaned_pgrp(task_pgrp(current), NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264
265
266
267
  	read_unlock(&tasklist_lock);
  
  	return retval;
  }
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
268
  static int has_stopped_jobs(struct pid *pgrp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
270
271
  {
  	int retval = 0;
  	struct task_struct *p;
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
272
  	do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
338077e54   Matthew Wilcox   exit: Use task_is_*
273
  		if (!task_is_stopped(p))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
  		retval = 1;
  		break;
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
277
  	} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
279
  	return retval;
  }
f49ee505b   Oleg Nesterov   introduce kill_or...
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
  /*
   * Check to see if any process groups have become orphaned as
   * a result of our exiting, and if they have any stopped jobs,
   * send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2)
   */
  static void
  kill_orphaned_pgrp(struct task_struct *tsk, struct task_struct *parent)
  {
  	struct pid *pgrp = task_pgrp(tsk);
  	struct task_struct *ignored_task = tsk;
  
  	if (!parent)
  		 /* exit: our father is in a different pgrp than
  		  * we are and we were the only connection outside.
  		  */
  		parent = tsk->real_parent;
  	else
  		/* reparent: our child is in a different pgrp than
  		 * we are, and it was the only connection outside.
  		 */
  		ignored_task = NULL;
  
  	if (task_pgrp(parent) != pgrp &&
  	    task_session(parent) == task_session(tsk) &&
  	    will_become_orphaned_pgrp(pgrp, ignored_task) &&
  	    has_stopped_jobs(pgrp)) {
  		__kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp);
  		__kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp);
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
  /**
49d769d52   Eric W. Biederman   Change reparent_t...
311
   * reparent_to_kthreadd - Reparent the calling kernel thread to kthreadd
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
313
   *
   * If a kernel thread is launched as a result of a system call, or if
49d769d52   Eric W. Biederman   Change reparent_t...
314
315
   * it ever exits, it should generally reparent itself to kthreadd so it
   * isn't in the way of other processes and is correctly cleaned up on exit.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
319
   *
   * The various task state such as scheduling policy and priority may have
   * been inherited from a user process, so we reset them to sane values here.
   *
49d769d52   Eric W. Biederman   Change reparent_t...
320
   * NOTE that reparent_to_kthreadd() gives the caller full capabilities.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
   */
49d769d52   Eric W. Biederman   Change reparent_t...
322
  static void reparent_to_kthreadd(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
324
325
326
327
  {
  	write_lock_irq(&tasklist_lock);
  
  	ptrace_unlink(current);
  	/* Reparent to init */
49d769d52   Eric W. Biederman   Change reparent_t...
328
  	current->real_parent = current->parent = kthreadd_task;
f470021ad   Roland McGrath   ptrace children r...
329
  	list_move_tail(&current->sibling, &current->real_parent->children);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
331
332
  
  	/* Set the exit signal to SIGCHLD so we signal init on exit */
  	current->exit_signal = SIGCHLD;
e05606d33   Ingo Molnar   sched: clean up t...
333
  	if (task_nice(current) < 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
334
335
336
337
  		set_user_nice(current, 0);
  	/* cpus_allowed? */
  	/* rt_priority? */
  	/* signals? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
  	memcpy(current->signal->rlim, init_task.signal->rlim,
  	       sizeof(current->signal->rlim));
d84f4f992   David Howells   CRED: Inaugurate ...
340
341
342
  
  	atomic_inc(&init_cred.usage);
  	commit_creds(&init_cred);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
343
  	write_unlock_irq(&tasklist_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
  }
8520d7c7f   Oleg Nesterov   teach set_special...
345
  void __set_special_pids(struct pid *pid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
346
  {
e19f247a3   Oren Laadan   [PATCH] setpgid: ...
347
  	struct task_struct *curr = current->group_leader;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
348

0d0df599f   Christian Borntraeger   connector: fix re...
349
  	if (task_session(curr) != pid)
7d8da0962   Oleg Nesterov   pids: __set_speci...
350
  		change_pid(curr, PIDTYPE_SID, pid);
1b0f7ffd0   Oleg Nesterov   pids: kill signal...
351
352
  
  	if (task_pgrp(curr) != pid)
7d8da0962   Oleg Nesterov   pids: __set_speci...
353
  		change_pid(curr, PIDTYPE_PGID, pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
  }
8520d7c7f   Oleg Nesterov   teach set_special...
355
  static void set_special_pids(struct pid *pid)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
357
  {
  	write_lock_irq(&tasklist_lock);
8520d7c7f   Oleg Nesterov   teach set_special...
358
  	__set_special_pids(pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
360
361
362
  	write_unlock_irq(&tasklist_lock);
  }
  
  /*
87245135d   Oleg Nesterov   allow_signal: kil...
363
364
   * Let kernel threads use this to say that they allow a certain signal.
   * Must not be used if kthread was cloned with CLONE_SIGHAND.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
366
367
   */
  int allow_signal(int sig)
  {
7ed20e1ad   Jesper Juhl   [PATCH] convert t...
368
  	if (!valid_signal(sig) || sig < 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
370
371
  		return -EINVAL;
  
  	spin_lock_irq(&current->sighand->siglock);
87245135d   Oleg Nesterov   allow_signal: kil...
372
  	/* This is only needed for daemonize()'ed kthreads */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
  	sigdelset(&current->blocked, sig);
87245135d   Oleg Nesterov   allow_signal: kil...
374
375
376
377
378
379
  	/*
  	 * Kernel threads handle their own signals. Let the signal code
  	 * know it'll be handled, so that they don't get converted to
  	 * SIGKILL or just silently dropped.
  	 */
  	current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
381
382
383
384
385
386
387
388
  	recalc_sigpending();
  	spin_unlock_irq(&current->sighand->siglock);
  	return 0;
  }
  
  EXPORT_SYMBOL(allow_signal);
  
  int disallow_signal(int sig)
  {
7ed20e1ad   Jesper Juhl   [PATCH] convert t...
389
  	if (!valid_signal(sig) || sig < 1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
392
  		return -EINVAL;
  
  	spin_lock_irq(&current->sighand->siglock);
10ab825bd   Oleg Nesterov   change kernel thr...
393
  	current->sighand->action[(sig)-1].sa.sa_handler = SIG_IGN;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
  	recalc_sigpending();
  	spin_unlock_irq(&current->sighand->siglock);
  	return 0;
  }
  
  EXPORT_SYMBOL(disallow_signal);
  
  /*
   *	Put all the gunge required to become a kernel thread without
   *	attached user resources in one place where it belongs.
   */
  
  void daemonize(const char *name, ...)
  {
  	va_list args;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
411
412
413
414
415
416
417
418
419
420
  	sigset_t blocked;
  
  	va_start(args, name);
  	vsnprintf(current->comm, sizeof(current->comm), name, args);
  	va_end(args);
  
  	/*
  	 * If we were started as result of loading a module, close all of the
  	 * user space pages.  We don't need them, and if we didn't close them
  	 * they would be locked into memory.
  	 */
  	exit_mm(current);
831441862   Rafael J. Wysocki   Freezer: make ker...
421
422
423
424
  	/*
  	 * We don't want to have TIF_FREEZE set if the system-wide hibernation
  	 * or suspend transition begins right now.
  	 */
7b34e4283   Oleg Nesterov   introduce PF_KTHR...
425
  	current->flags |= (PF_NOFREEZE | PF_KTHREAD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426

8520d7c7f   Oleg Nesterov   teach set_special...
427
428
429
430
  	if (current->nsproxy != &init_nsproxy) {
  		get_nsproxy(&init_nsproxy);
  		switch_task_namespaces(current, &init_nsproxy);
  	}
297bd42b1   Oleg Nesterov   move daemonized k...
431
  	set_special_pids(&init_struct_pid);
24ec839c4   Peter Zijlstra   [PATCH] tty: ->si...
432
  	proc_clear_tty(current);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433
434
435
436
437
438
439
  
  	/* Block and flush all signals */
  	sigfillset(&blocked);
  	sigprocmask(SIG_BLOCK, &blocked, NULL);
  	flush_signals(current);
  
  	/* Become as one with the init task */
3e93cd671   Al Viro   Take fs_struct ha...
440
  	daemonize_fs_struct();
d4c5e41f3   Daniel Walker   whitespace fixes:...
441
  	exit_files(current);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
443
  	current->files = init_task.files;
  	atomic_inc(&current->files->count);
49d769d52   Eric W. Biederman   Change reparent_t...
444
  	reparent_to_kthreadd();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
  }
  
  EXPORT_SYMBOL(daemonize);
858119e15   Arjan van de Ven   [PATCH] Unlinline...
448
  static void close_files(struct files_struct * files)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
  {
  	int i, j;
badf16621   Dipankar Sarma   [PATCH] files: br...
451
  	struct fdtable *fdt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
453
  
  	j = 0;
4fb3a5386   Dipankar Sarma   [PATCH] files: fi...
454
455
456
457
  
  	/*
  	 * It is safe to dereference the fd table without RCU or
  	 * ->file_lock because this is the last reference to the
d11c563dd   Paul E. McKenney   sched: Use lockde...
458
  	 * files structure.  But use RCU to shut RCU-lockdep up.
4fb3a5386   Dipankar Sarma   [PATCH] files: fi...
459
  	 */
d11c563dd   Paul E. McKenney   sched: Use lockde...
460
  	rcu_read_lock();
badf16621   Dipankar Sarma   [PATCH] files: br...
461
  	fdt = files_fdtable(files);
d11c563dd   Paul E. McKenney   sched: Use lockde...
462
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
  	for (;;) {
  		unsigned long set;
  		i = j * __NFDBITS;
bbea9f696   Vadim Lobanov   [PATCH] fdtable: ...
466
  		if (i >= fdt->max_fds)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
467
  			break;
badf16621   Dipankar Sarma   [PATCH] files: br...
468
  		set = fdt->open_fds->fds_bits[j++];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
470
  		while (set) {
  			if (set & 1) {
badf16621   Dipankar Sarma   [PATCH] files: br...
471
  				struct file * file = xchg(&fdt->fd[i], NULL);
944be0b22   Ingo Molnar   [PATCH] close_fil...
472
  				if (file) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
473
  					filp_close(file, files);
944be0b22   Ingo Molnar   [PATCH] close_fil...
474
475
  					cond_resched();
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
  			}
  			i++;
  			set >>= 1;
  		}
  	}
  }
  
  struct files_struct *get_files_struct(struct task_struct *task)
  {
  	struct files_struct *files;
  
  	task_lock(task);
  	files = task->files;
  	if (files)
  		atomic_inc(&files->count);
  	task_unlock(task);
  
  	return files;
  }
7ad5b3a50   Harvey Harrison   kernel: remove fa...
495
  void put_files_struct(struct files_struct *files)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
496
  {
badf16621   Dipankar Sarma   [PATCH] files: br...
497
  	struct fdtable *fdt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
498
499
500
501
  	if (atomic_dec_and_test(&files->count)) {
  		close_files(files);
  		/*
  		 * Free the fd and fdset arrays if we expanded them.
ab2af1f50   Dipankar Sarma   [PATCH] files: fi...
502
503
504
  		 * If the fdtable was embedded, pass files for freeing
  		 * at the end of the RCU grace period. Otherwise,
  		 * you can free files immediately.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505
  		 */
d11c563dd   Paul E. McKenney   sched: Use lockde...
506
  		rcu_read_lock();
badf16621   Dipankar Sarma   [PATCH] files: br...
507
  		fdt = files_fdtable(files);
4fd45812c   Vadim Lobanov   [PATCH] fdtable: ...
508
  		if (fdt != &files->fdtab)
ab2af1f50   Dipankar Sarma   [PATCH] files: fi...
509
  			kmem_cache_free(files_cachep, files);
01b2d93ca   Vadim Lobanov   [PATCH] fdtable: ...
510
  		free_fdtable(fdt);
d11c563dd   Paul E. McKenney   sched: Use lockde...
511
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
513
  	}
  }
3b1253880   Al Viro   [PATCH] sanitize ...
514
  void reset_files_struct(struct files_struct *files)
3b9b8ab65   Kirill Korotaev   [PATCH] Fix unser...
515
  {
3b1253880   Al Viro   [PATCH] sanitize ...
516
  	struct task_struct *tsk = current;
3b9b8ab65   Kirill Korotaev   [PATCH] Fix unser...
517
518
519
520
521
522
523
524
  	struct files_struct *old;
  
  	old = tsk->files;
  	task_lock(tsk);
  	tsk->files = files;
  	task_unlock(tsk);
  	put_files_struct(old);
  }
3b9b8ab65   Kirill Korotaev   [PATCH] Fix unser...
525

1ec7f1ddb   Al Viro   [PATCH] get rid o...
526
  void exit_files(struct task_struct *tsk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527
528
529
530
531
532
533
534
535
536
  {
  	struct files_struct * files = tsk->files;
  
  	if (files) {
  		task_lock(tsk);
  		tsk->files = NULL;
  		task_unlock(tsk);
  		put_files_struct(files);
  	}
  }
cf475ad28   Balbir Singh   cgroups: add an o...
537
538
539
540
541
542
543
544
545
546
547
  #ifdef CONFIG_MM_OWNER
  /*
   * Task p is exiting and it owned mm, lets find a new owner for it
   */
  static inline int
  mm_need_new_owner(struct mm_struct *mm, struct task_struct *p)
  {
  	/*
  	 * If there are other users of the mm and the owner (us) is exiting
  	 * we need to find a new owner to take on the responsibility.
  	 */
cf475ad28   Balbir Singh   cgroups: add an o...
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
  	if (atomic_read(&mm->mm_users) <= 1)
  		return 0;
  	if (mm->owner != p)
  		return 0;
  	return 1;
  }
  
  void mm_update_next_owner(struct mm_struct *mm)
  {
  	struct task_struct *c, *g, *p = current;
  
  retry:
  	if (!mm_need_new_owner(mm, p))
  		return;
  
  	read_lock(&tasklist_lock);
  	/*
  	 * Search in the children
  	 */
  	list_for_each_entry(c, &p->children, sibling) {
  		if (c->mm == mm)
  			goto assign_new_owner;
  	}
  
  	/*
  	 * Search in the siblings
  	 */
dea33cfd9   Oleg Nesterov   ptrace: mm_need_n...
575
  	list_for_each_entry(c, &p->real_parent->children, sibling) {
cf475ad28   Balbir Singh   cgroups: add an o...
576
577
578
579
580
581
582
583
584
585
586
587
588
589
  		if (c->mm == mm)
  			goto assign_new_owner;
  	}
  
  	/*
  	 * Search through everything else. We should not get
  	 * here often
  	 */
  	do_each_thread(g, c) {
  		if (c->mm == mm)
  			goto assign_new_owner;
  	} while_each_thread(g, c);
  
  	read_unlock(&tasklist_lock);
31a78f23b   Balbir Singh   mm owner: fix rac...
590
591
592
  	/*
  	 * We found no owner yet mm_users > 1: this implies that we are
  	 * most likely racing with swapoff (try_to_unuse()) or /proc or
e5991371e   Hugh Dickins   mm: remove cgroup...
593
  	 * ptrace or page migration (get_task_mm()).  Mark owner as NULL.
31a78f23b   Balbir Singh   mm owner: fix rac...
594
  	 */
31a78f23b   Balbir Singh   mm owner: fix rac...
595
  	mm->owner = NULL;
cf475ad28   Balbir Singh   cgroups: add an o...
596
597
598
599
600
601
602
603
604
605
  	return;
  
  assign_new_owner:
  	BUG_ON(c == p);
  	get_task_struct(c);
  	/*
  	 * The task_lock protects c->mm from changing.
  	 * We always want mm->owner->mm == mm
  	 */
  	task_lock(c);
e5991371e   Hugh Dickins   mm: remove cgroup...
606
607
608
609
610
  	/*
  	 * Delay read_unlock() till we have the task_lock()
  	 * to ensure that c does not slip away underneath us
  	 */
  	read_unlock(&tasklist_lock);
cf475ad28   Balbir Singh   cgroups: add an o...
611
612
613
614
615
  	if (c->mm != mm) {
  		task_unlock(c);
  		put_task_struct(c);
  		goto retry;
  	}
cf475ad28   Balbir Singh   cgroups: add an o...
616
617
618
619
620
  	mm->owner = c;
  	task_unlock(c);
  	put_task_struct(c);
  }
  #endif /* CONFIG_MM_OWNER */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621
622
623
624
  /*
   * Turn us into a lazy TLB process if we
   * aren't already..
   */
408b664a7   Adrian Bunk   [PATCH] make lots...
625
  static void exit_mm(struct task_struct * tsk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
626
627
  {
  	struct mm_struct *mm = tsk->mm;
b564daf80   Oleg Nesterov   coredump: constru...
628
  	struct core_state *core_state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
630
631
632
633
634
  
  	mm_release(tsk, mm);
  	if (!mm)
  		return;
  	/*
  	 * Serialize with any possible pending coredump.
999d9fc16   Oleg Nesterov   coredump: move mm...
635
  	 * We must hold mmap_sem around checking core_state
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
  	 * and clearing tsk->mm.  The core-inducing thread
999d9fc16   Oleg Nesterov   coredump: move mm...
637
  	 * will increment ->nr_threads for each thread in the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
639
640
  	 * group with ->mm != NULL.
  	 */
  	down_read(&mm->mmap_sem);
b564daf80   Oleg Nesterov   coredump: constru...
641
642
643
  	core_state = mm->core_state;
  	if (core_state) {
  		struct core_thread self;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
644
  		up_read(&mm->mmap_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
645

b564daf80   Oleg Nesterov   coredump: constru...
646
647
648
649
650
651
652
653
  		self.task = tsk;
  		self.next = xchg(&core_state->dumper.next, &self);
  		/*
  		 * Implies mb(), the result of xchg() must be visible
  		 * to core_state->dumper.
  		 */
  		if (atomic_dec_and_test(&core_state->nr_threads))
  			complete(&core_state->startup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
654

a94e2d408   Oleg Nesterov   coredump: kill mm...
655
656
657
658
659
660
661
  		for (;;) {
  			set_task_state(tsk, TASK_UNINTERRUPTIBLE);
  			if (!self.task) /* see coredump_finish() */
  				break;
  			schedule();
  		}
  		__set_task_state(tsk, TASK_RUNNING);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
662
663
664
  		down_read(&mm->mmap_sem);
  	}
  	atomic_inc(&mm->mm_count);
125e18745   Eric Sesterhenn   [PATCH] More BUG_...
665
  	BUG_ON(mm != tsk->active_mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666
667
668
669
670
  	/* more a memory barrier than a real lock */
  	task_lock(tsk);
  	tsk->mm = NULL;
  	up_read(&mm->mmap_sem);
  	enter_lazy_tlb(mm, current);
0c1eecfb3   Rafael J. Wysocki   Freezer: avoid fr...
671
672
  	/* We don't want this task to be frozen prematurely */
  	clear_freeze_flag(tsk);
3d5992d2a   Ying Han   oom: add per-mm o...
673
674
  	if (tsk->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
  		atomic_dec(&mm->oom_disable_count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
675
  	task_unlock(tsk);
cf475ad28   Balbir Singh   cgroups: add an o...
676
  	mm_update_next_owner(mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
678
  	mmput(mm);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
679
680
681
682
  /*
   * When we die, we re-parent all our children.
   * Try to give them to another thread in our thread
   * group, and if no such member exists, give it to
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
683
684
   * the child reaper process (ie "init") in our pid
   * space.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
   */
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
686
  static struct task_struct *find_new_reaper(struct task_struct *father)
d16e15f5b   Namhyung Kim   exit: add lock co...
687
688
  	__releases(&tasklist_lock)
  	__acquires(&tasklist_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
  {
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
690
691
  	struct pid_namespace *pid_ns = task_active_pid_ns(father);
  	struct task_struct *thread;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692

950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
693
694
695
696
697
698
699
700
  	thread = father;
  	while_each_thread(father, thread) {
  		if (thread->flags & PF_EXITING)
  			continue;
  		if (unlikely(pid_ns->child_reaper == father))
  			pid_ns->child_reaper = thread;
  		return thread;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701

950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
702
703
704
705
  	if (unlikely(pid_ns->child_reaper == father)) {
  		write_unlock_irq(&tasklist_lock);
  		if (unlikely(pid_ns == &init_pid_ns))
  			panic("Attempted to kill init!");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706

950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
707
708
  		zap_pid_ns_processes(pid_ns);
  		write_lock_irq(&tasklist_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
  		/*
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
710
711
712
  		 * We can not clear ->child_reaper or leave it alone.
  		 * There may by stealth EXIT_DEAD tasks on ->children,
  		 * forget_original_parent() must move them somewhere.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713
  		 */
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
714
  		pid_ns->child_reaper = init_pid_ns.child_reaper;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
715
  	}
762a24bee   Oleg Nesterov   pid namespaces: r...
716

950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
717
718
  	return pid_ns->child_reaper;
  }
5dfc80be7   Oleg Nesterov   forget_original_p...
719
720
721
  /*
  * Any that need to be release_task'd are put on the @dead list.
   */
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
722
  static void reparent_leader(struct task_struct *father, struct task_struct *p,
5dfc80be7   Oleg Nesterov   forget_original_p...
723
724
  				struct list_head *dead)
  {
5dfc80be7   Oleg Nesterov   forget_original_p...
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
  	list_move_tail(&p->sibling, &p->real_parent->children);
  
  	if (task_detached(p))
  		return;
  	/*
  	 * If this is a threaded reparent there is no need to
  	 * notify anyone anything has happened.
  	 */
  	if (same_thread_group(p->real_parent, father))
  		return;
  
  	/* We don't want people slaying init.  */
  	p->exit_signal = SIGCHLD;
  
  	/* If it has exited notify the new parent about this child's death. */
5cb114468   Oleg Nesterov   ptrace: do not us...
740
  	if (!task_ptrace(p) &&
5dfc80be7   Oleg Nesterov   forget_original_p...
741
742
743
744
745
746
747
748
749
750
  	    p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) {
  		do_notify_parent(p, p->exit_signal);
  		if (task_detached(p)) {
  			p->exit_state = EXIT_DEAD;
  			list_move_tail(&p->sibling, dead);
  		}
  	}
  
  	kill_orphaned_pgrp(p, father);
  }
762a24bee   Oleg Nesterov   pid namespaces: r...
751
  static void forget_original_parent(struct task_struct *father)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752
  {
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
753
  	struct task_struct *p, *n, *reaper;
5dfc80be7   Oleg Nesterov   forget_original_p...
754
  	LIST_HEAD(dead_children);
762a24bee   Oleg Nesterov   pid namespaces: r...
755
756
  
  	write_lock_irq(&tasklist_lock);
c7e49c148   Oleg Nesterov   ptrace: optimize ...
757
758
759
760
761
  	/*
  	 * Note that exit_ptrace() and find_new_reaper() might
  	 * drop tasklist_lock and reacquire it.
  	 */
  	exit_ptrace(father);
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
762
  	reaper = find_new_reaper(father);
f470021ad   Roland McGrath   ptrace children r...
763

03ff17979   Matthias Kaehlcke   kernel/exit.c: Us...
764
  	list_for_each_entry_safe(p, n, &father->children, sibling) {
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
765
766
767
768
769
770
771
772
773
774
775
776
  		struct task_struct *t = p;
  		do {
  			t->real_parent = reaper;
  			if (t->parent == father) {
  				BUG_ON(task_ptrace(t));
  				t->parent = t->real_parent;
  			}
  			if (t->pdeath_signal)
  				group_send_sig_info(t->pdeath_signal,
  						    SEND_SIG_NOINFO, t);
  		} while_each_thread(p, t);
  		reparent_leader(father, p, &dead_children);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
  	}
762a24bee   Oleg Nesterov   pid namespaces: r...
778
  	write_unlock_irq(&tasklist_lock);
5dfc80be7   Oleg Nesterov   forget_original_p...
779

762a24bee   Oleg Nesterov   pid namespaces: r...
780
  	BUG_ON(!list_empty(&father->children));
762a24bee   Oleg Nesterov   pid namespaces: r...
781

5dfc80be7   Oleg Nesterov   forget_original_p...
782
783
  	list_for_each_entry_safe(p, n, &dead_children, sibling) {
  		list_del_init(&p->sibling);
39c626ae4   Oleg Nesterov   forget_original_p...
784
785
  		release_task(p);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
786
787
788
789
790
791
  }
  
  /*
   * Send signals to all our closest relatives so that they know
   * to properly mourn us..
   */
821c7de71   Oleg Nesterov   exit_notify: fix ...
792
  static void exit_notify(struct task_struct *tsk, int group_dead)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
  {
2b2a1ff64   Roland McGrath   tracehook: death
794
795
  	int signal;
  	void *cookie;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
798
799
800
801
802
803
804
  	/*
  	 * This does two things:
  	 *
    	 * A.  Make init inherit all the child processes
  	 * B.  Check to see if any process groups have become orphaned
  	 *	as a result of our exiting, and if they have any stopped
  	 *	jobs, send them a SIGHUP and then a SIGCONT.  (POSIX 3.2.2.2)
  	 */
762a24bee   Oleg Nesterov   pid namespaces: r...
805
  	forget_original_parent(tsk);
2e4a70726   Pavel Emelyanov   pid namespaces: m...
806
  	exit_task_namespaces(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
807

762a24bee   Oleg Nesterov   pid namespaces: r...
808
  	write_lock_irq(&tasklist_lock);
821c7de71   Oleg Nesterov   exit_notify: fix ...
809
810
  	if (group_dead)
  		kill_orphaned_pgrp(tsk->group_leader, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811

247284481   Oleg Nesterov   Kill some obsolet...
812
  	/* Let father know we died
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
814
  	 *
  	 * Thread signals are configurable, but you aren't going to use
25985edce   Lucas De Marchi   Fix common misspe...
815
  	 * that to send signals to arbitrary processes.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
816
817
818
819
820
821
822
823
824
  	 * That stops right now.
  	 *
  	 * If the parent exec id doesn't match the exec id we saved
  	 * when we started then we know the parent has changed security
  	 * domain.
  	 *
  	 * If our self_exec id doesn't match our parent_exec_id then
  	 * we have changed execution domain as these two values started
  	 * the same after a fork.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
825
  	 */
d839fd4d2   Oleg Nesterov   ptrace: introduce...
826
  	if (tsk->exit_signal != SIGCHLD && !task_detached(tsk) &&
f49ee505b   Oleg Nesterov   introduce kill_or...
827
  	    (tsk->parent_exec_id != tsk->real_parent->self_exec_id ||
432870dab   Oleg Nesterov   exit_notify: kill...
828
  	     tsk->self_exec_id != tsk->parent_exec_id))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
829
  		tsk->exit_signal = SIGCHLD;
2b2a1ff64   Roland McGrath   tracehook: death
830
  	signal = tracehook_notify_death(tsk, &cookie, group_dead);
5c7edcd7e   Roland McGrath   tracehook: fix ex...
831
  	if (signal >= 0)
2b2a1ff64   Roland McGrath   tracehook: death
832
  		signal = do_notify_parent(tsk, signal);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
833

5c7edcd7e   Roland McGrath   tracehook: fix ex...
834
  	tsk->exit_state = signal == DEATH_REAP ? EXIT_DEAD : EXIT_ZOMBIE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
835

9c3391684   Oleg Nesterov   exit: exit_notify...
836
837
  	/* mt-exec, de_thread() is waiting for group leader */
  	if (unlikely(tsk->signal->notify_count < 0))
6db840fa7   Oleg Nesterov   exec: RT sub-thre...
838
  		wake_up_process(tsk->signal->group_exit_task);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
  	write_unlock_irq(&tasklist_lock);
2b2a1ff64   Roland McGrath   tracehook: death
840
  	tracehook_report_death(tsk, signal, cookie, group_dead);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
841
  	/* If the process is dead, release it - nobody will wait for it */
5c7edcd7e   Roland McGrath   tracehook: fix ex...
842
  	if (signal == DEATH_REAP)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  		release_task(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
844
  }
e18eecb8b   Jeff Dike   Add generic exit-...
845
846
847
848
849
  #ifdef CONFIG_DEBUG_STACK_USAGE
  static void check_stack_usage(void)
  {
  	static DEFINE_SPINLOCK(low_water_lock);
  	static int lowest_to_date = THREAD_SIZE;
e18eecb8b   Jeff Dike   Add generic exit-...
850
  	unsigned long free;
7c9f8861e   Eric Sandeen   stackprotector: u...
851
  	free = stack_not_used(current);
e18eecb8b   Jeff Dike   Add generic exit-...
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
  
  	if (free >= lowest_to_date)
  		return;
  
  	spin_lock(&low_water_lock);
  	if (free < lowest_to_date) {
  		printk(KERN_WARNING "%s used greatest stack depth: %lu bytes "
  				"left
  ",
  				current->comm, free);
  		lowest_to_date = free;
  	}
  	spin_unlock(&low_water_lock);
  }
  #else
  static inline void check_stack_usage(void) {}
  #endif
7ad5b3a50   Harvey Harrison   kernel: remove fa...
869
  NORET_TYPE void do_exit(long code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
870
871
872
873
874
  {
  	struct task_struct *tsk = current;
  	int group_dead;
  
  	profile_task_exit(tsk);
22e2c507c   Jens Axboe   [PATCH] Update cf...
875
  	WARN_ON(atomic_read(&tsk->fs_excl));
73c101011   Jens Axboe   block: initial pa...
876
  	WARN_ON(blk_needs_flush_plug(tsk));
22e2c507c   Jens Axboe   [PATCH] Update cf...
877

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
878
879
880
881
  	if (unlikely(in_interrupt()))
  		panic("Aiee, killing interrupt handler!");
  	if (unlikely(!tsk->pid))
  		panic("Attempted to kill the idle task!");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882

33dd94ae1   Nelson Elhage   do_exit(): make s...
883
884
885
886
887
888
889
890
  	/*
  	 * If do_exit is called because this processes oopsed, it's possible
  	 * that get_fs() was left as KERNEL_DS, so reset it to USER_DS before
  	 * continuing. Amongst other possible reasons, this is to prevent
  	 * mm_release()->clear_child_tid() from writing to a user-controlled
  	 * kernel address.
  	 */
  	set_fs(USER_DS);
30199f5a4   Roland McGrath   tracehook: exit
891
  	tracehook_report_exit(&code);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892

e0e817392   David Howells   CRED: Add some co...
893
  	validate_creds_for_do_exit(tsk);
df164db5f   Alexander Nyberg   [PATCH] avoid res...
894
895
896
897
898
899
900
901
  	/*
  	 * We're taking recursive faults here in do_exit. Safest is to just
  	 * leave this task alone and wait for reboot.
  	 */
  	if (unlikely(tsk->flags & PF_EXITING)) {
  		printk(KERN_ALERT
  			"Fixing recursive fault but reboot is needed!
  ");
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
902
903
904
905
906
907
908
909
910
911
  		/*
  		 * We can do this unlocked here. The futex code uses
  		 * this flag just to verify whether the pi state
  		 * cleanup has been done or not. In the worst case it
  		 * loops once more. We pretend that the cleanup was
  		 * done as there is no way to return. Either the
  		 * OWNER_DIED bit is set by now or we push the blocked
  		 * task into the wait for ever nirwana as well.
  		 */
  		tsk->flags |= PF_EXITPIDONE;
df164db5f   Alexander Nyberg   [PATCH] avoid res...
912
913
914
  		set_current_state(TASK_UNINTERRUPTIBLE);
  		schedule();
  	}
3aa551c9b   Thomas Gleixner   genirq: add threa...
915
  	exit_irq_thread();
d12619b5f   Oleg Nesterov   fix group stop wi...
916
  	exit_signals(tsk);  /* sets PF_EXITING */
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
917
918
919
920
  	/*
  	 * tsk->flags are checked in the futex code to protect against
  	 * an exiting task cleaning up the robust pi futexes.
  	 */
d2ee7198c   Oleg Nesterov   pi-futex: set PF_...
921
  	smp_mb();
1d6154825   Thomas Gleixner   sched: Convert pi...
922
  	raw_spin_unlock_wait(&tsk->pi_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
925
926
  	if (unlikely(in_atomic()))
  		printk(KERN_INFO "note: %s[%d] exited with preempt_count %d
  ",
ba25f9dcc   Pavel Emelyanov   Use helpers to ob...
927
  				current->comm, task_pid_nr(current),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
929
930
  				preempt_count());
  
  	acct_update_integrals(tsk);
34e55232e   KAMEZAWA Hiroyuki   mm: avoid false s...
931
  	/* sync mm's RSS info before statistics gathering */
a3a2e76c7   KAMEZAWA Hiroyuki   mm: avoid null-po...
932
933
  	if (tsk->mm)
  		sync_mm_rss(tsk, tsk->mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
934
  	group_dead = atomic_dec_and_test(&tsk->signal->live);
c30689516   Andrew Morton   [PATCH] revert "t...
935
  	if (group_dead) {
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
936
  		hrtimer_cancel(&tsk->signal->real_timer);
25f407f0b   Roland McGrath   [PATCH] Call exit...
937
  		exit_itimers(tsk->signal);
1f10206cf   Jiri Pirko   getrusage: fill r...
938
939
  		if (tsk->mm)
  			setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm);
c30689516   Andrew Morton   [PATCH] revert "t...
940
  	}
f6ec29a42   KaiGai Kohei   [PATCH] pacct: av...
941
  	acct_collect(code, group_dead);
522ed7767   Miloslav Trmac   Audit: add TTY in...
942
943
  	if (group_dead)
  		tty_audit_exit();
fa84cb935   Al Viro   [PATCH] move call...
944
945
  	if (unlikely(tsk->audit_context))
  		audit_free(tsk);
115085ea0   Oleg Nesterov   [PATCH] taskstats...
946

f2ab6d888   Jonathan Lim   Assign task_struc...
947
  	tsk->exit_code = code;
115085ea0   Oleg Nesterov   [PATCH] taskstats...
948
  	taskstats_exit(tsk, group_dead);
c757249af   Shailabh Nagar   [PATCH] per-task-...
949

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950
  	exit_mm(tsk);
0e4648141   KaiGai Kohei   [PATCH] pacct: ad...
951
  	if (group_dead)
f6ec29a42   KaiGai Kohei   [PATCH] pacct: av...
952
  		acct_process();
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
953
  	trace_sched_process_exit(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
954
  	exit_sem(tsk);
1ec7f1ddb   Al Viro   [PATCH] get rid o...
955
956
  	exit_files(tsk);
  	exit_fs(tsk);
e18eecb8b   Jeff Dike   Add generic exit-...
957
  	check_stack_usage();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
  	exit_thread();
0b3fcf178   Stephane Eranian   perf_events: Move...
959
960
961
962
963
964
965
966
  
  	/*
  	 * Flush inherited counters to the parent - before the parent
  	 * gets woken up by child-exit notifications.
  	 *
  	 * because of cgroup mode, must be called before cgroup_exit()
  	 */
  	perf_event_exit_task(tsk);
b4f48b636   Paul Menage   Task Control Grou...
967
  	cgroup_exit(tsk, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968

5ec93d115   Alan Cox   tty: Move the lea...
969
  	if (group_dead)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
970
  		disassociate_ctty(1);
a1261f546   Al Viro   [PATCH] m68k: int...
971
  	module_put(task_thread_info(tsk)->exec_domain->module);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972

9f46080c4   Matt Helsley   [PATCH] Process E...
973
  	proc_exit_connector(tsk);
33b2fb303   Ingo Molnar   perf_counter: fix...
974
975
  
  	/*
24f1e32c6   Frederic Weisbecker   hw-breakpoints: R...
976
977
  	 * FIXME: do that only when needed, using sched_exit tracepoint
  	 */
bf26c0184   Frederic Weisbecker   ptrace: Prepare t...
978
  	ptrace_put_breakpoints(tsk);
33b2fb303   Ingo Molnar   perf_counter: fix...
979

821c7de71   Oleg Nesterov   exit_notify: fix ...
980
  	exit_notify(tsk, group_dead);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
981
  #ifdef CONFIG_NUMA
c0ff7453b   Miao Xie   cpuset,mm: fix no...
982
  	task_lock(tsk);
f0be3d32b   Lee Schermerhorn   mempolicy: rename...
983
  	mpol_put(tsk->mempolicy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
  	tsk->mempolicy = NULL;
c0ff7453b   Miao Xie   cpuset,mm: fix no...
985
  	task_unlock(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
  #endif
42b2dd0a0   Alexey Dobriyan   Shrink task_struc...
987
  #ifdef CONFIG_FUTEX
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
988
989
  	if (unlikely(current->pi_state_cache))
  		kfree(current->pi_state_cache);
42b2dd0a0   Alexey Dobriyan   Shrink task_struc...
990
  #endif
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
991
  	/*
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
992
  	 * Make sure we are holding no locks:
de5097c2e   Ingo Molnar   [PATCH] mutex sub...
993
  	 */
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
994
  	debug_check_no_locks_held(tsk);
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
995
996
997
998
999
1000
  	/*
  	 * We can do this unlocked here. The futex code uses this flag
  	 * just to verify whether the pi state cleanup has been done
  	 * or not. In the worst case it loops once more.
  	 */
  	tsk->flags |= PF_EXITPIDONE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001

afc847b7d   Al Viro   [PATCH] don't do ...
1002
  	if (tsk->io_context)
b69f22920   Louis Rilling   block: Fix io_con...
1003
  		exit_io_context(tsk);
afc847b7d   Al Viro   [PATCH] don't do ...
1004

b92ce5589   Jens Axboe   [PATCH] splice: a...
1005
1006
  	if (tsk->splice_pipe)
  		__free_pipe_info(tsk->splice_pipe);
e0e817392   David Howells   CRED: Add some co...
1007
  	validate_creds_for_do_exit(tsk);
7407251a0   Coywolf Qi Hunt   [PATCH] PF_DEAD c...
1008
  	preempt_disable();
f41d911f8   Paul E. McKenney   rcu: Merge preemp...
1009
  	exit_rcu();
55a101f8f   Oleg Nesterov   [PATCH] kill PF_D...
1010
  	/* causes final put_task_struct in finish_task_switch(). */
c394cc9fb   Oleg Nesterov   [PATCH] introduce...
1011
  	tsk->state = TASK_DEAD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1012
1013
1014
  	schedule();
  	BUG();
  	/* Avoid "noreturn function does return".  */
54306cf04   Alan Cox   [PATCH] exit: fix...
1015
1016
  	for (;;)
  		cpu_relax();	/* For when BUG is null */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1017
  }
012914dad   Russ Anderson   [patch] MCA recov...
1018
  EXPORT_SYMBOL_GPL(do_exit);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019
1020
1021
1022
  NORET_TYPE void complete_and_exit(struct completion *comp, long code)
  {
  	if (comp)
  		complete(comp);
55a101f8f   Oleg Nesterov   [PATCH] kill PF_D...
1023

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1024
1025
1026
1027
  	do_exit(code);
  }
  
  EXPORT_SYMBOL(complete_and_exit);
754fe8d29   Heiko Carstens   [CVE-2009-0029] S...
1028
  SYSCALL_DEFINE1(exit, int, error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1029
1030
1031
  {
  	do_exit((error_code&0xff)<<8);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1032
1033
1034
1035
1036
1037
1038
  /*
   * Take down every thread in the group.  This is called by fatal signals
   * as well as by sys_exit_group (below).
   */
  NORET_TYPE void
  do_group_exit(int exit_code)
  {
bfc4b0890   Oleg Nesterov   signals: do_group...
1039
  	struct signal_struct *sig = current->signal;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1040
  	BUG_ON(exit_code & 0x80); /* core dumps don't get here */
bfc4b0890   Oleg Nesterov   signals: do_group...
1041
1042
  	if (signal_group_exit(sig))
  		exit_code = sig->group_exit_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1043
  	else if (!thread_group_empty(current)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1044
  		struct sighand_struct *const sighand = current->sighand;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1045
  		spin_lock_irq(&sighand->siglock);
ed5d2cac1   Oleg Nesterov   exec: rework the ...
1046
  		if (signal_group_exit(sig))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047
1048
1049
  			/* Another thread got here before we took the lock.  */
  			exit_code = sig->group_exit_code;
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1050
  			sig->group_exit_code = exit_code;
ed5d2cac1   Oleg Nesterov   exec: rework the ...
1051
  			sig->flags = SIGNAL_GROUP_EXIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052
1053
1054
  			zap_other_threads(current);
  		}
  		spin_unlock_irq(&sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
  	}
  
  	do_exit(exit_code);
  	/* NOTREACHED */
  }
  
  /*
   * this kills every thread in the thread group. Note that any externally
   * wait4()-ing process will get the correct exit code - even if this
   * thread is not the thread group leader.
   */
754fe8d29   Heiko Carstens   [CVE-2009-0029] S...
1066
  SYSCALL_DEFINE1(exit_group, int, error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1067
1068
  {
  	do_group_exit((error_code & 0xff) << 8);
2ed7c03ec   Heiko Carstens   [CVE-2009-0029] C...
1069
1070
  	/* NOTREACHED */
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1071
  }
9e8ae01d1   Oleg Nesterov   introduce "struct...
1072
1073
  struct wait_opts {
  	enum pid_type		wo_type;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1074
  	int			wo_flags;
e1eb1ebcc   Richard Kennedy   mm: exit.c reorde...
1075
  	struct pid		*wo_pid;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1076
1077
1078
1079
  
  	struct siginfo __user	*wo_info;
  	int __user		*wo_stat;
  	struct rusage __user	*wo_rusage;
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1080
  	wait_queue_t		child_wait;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1081
1082
  	int			notask_error;
  };
989264f46   Oleg Nesterov   do_wait-wakeup-op...
1083
1084
  static inline
  struct pid *task_pid_type(struct task_struct *task, enum pid_type type)
161550d74   Eric W. Biederman   pid: sys_wait... ...
1085
  {
989264f46   Oleg Nesterov   do_wait-wakeup-op...
1086
1087
1088
  	if (type != PIDTYPE_PID)
  		task = task->group_leader;
  	return task->pids[type].pid;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1089
  }
989264f46   Oleg Nesterov   do_wait-wakeup-op...
1090
  static int eligible_pid(struct wait_opts *wo, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  {
5c01ba49e   Oleg Nesterov   do_wait-wakeup-op...
1092
1093
1094
  	return	wo->wo_type == PIDTYPE_MAX ||
  		task_pid_type(p, wo->wo_type) == wo->wo_pid;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1095

5c01ba49e   Oleg Nesterov   do_wait-wakeup-op...
1096
1097
1098
1099
  static int eligible_child(struct wait_opts *wo, struct task_struct *p)
  {
  	if (!eligible_pid(wo, p))
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1100
1101
1102
1103
1104
  	/* Wait for all children (clone and not) if __WALL is set;
  	 * otherwise, wait for clone children *only* if __WCLONE is
  	 * set; otherwise, wait for non-clone children *only*.  (Note:
  	 * A "clone" child here is one that reports to its parent
  	 * using a signal other than SIGCHLD.) */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1105
1106
  	if (((p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE))
  	    && !(wo->wo_flags & __WALL))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1107
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1108

14dd0b814   Roland McGrath   do_wait: return s...
1109
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110
  }
9e8ae01d1   Oleg Nesterov   introduce "struct...
1111
1112
  static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p,
  				pid_t pid, uid_t uid, int why, int status)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1114
1115
1116
  	struct siginfo __user *infop;
  	int retval = wo->wo_rusage
  		? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0;
36c8b5868   Ingo Molnar   [PATCH] sched: cl...
1117

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1118
  	put_task_struct(p);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1119
  	infop = wo->wo_info;
b6fe2d117   Vitaly Mayatskikh   wait_noreap_copyo...
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
  	if (infop) {
  		if (!retval)
  			retval = put_user(SIGCHLD, &infop->si_signo);
  		if (!retval)
  			retval = put_user(0, &infop->si_errno);
  		if (!retval)
  			retval = put_user((short)why, &infop->si_code);
  		if (!retval)
  			retval = put_user(pid, &infop->si_pid);
  		if (!retval)
  			retval = put_user(uid, &infop->si_uid);
  		if (!retval)
  			retval = put_user(status, &infop->si_status);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
  	if (!retval)
  		retval = pid;
  	return retval;
  }
  
  /*
   * Handle sys_wait4 work for one task in state EXIT_ZOMBIE.  We hold
   * read_lock(&tasklist_lock) on entry.  If we return zero, we still hold
   * the lock and this task is uninteresting.  If we return nonzero, we have
   * released the lock and the system call should return.
   */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1145
  static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1146
1147
  {
  	unsigned long state;
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1148
  	int retval, status, traced;
6c5f3e7b4   Pavel Emelyanov   Pidns: make full ...
1149
  	pid_t pid = task_pid_vnr(p);
c69e8d9c0   David Howells   CRED: Use RCU to ...
1150
  	uid_t uid = __task_cred(p)->uid;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1151
  	struct siginfo __user *infop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1152

9e8ae01d1   Oleg Nesterov   introduce "struct...
1153
  	if (!likely(wo->wo_flags & WEXITED))
98abed020   Roland McGrath   do_wait reorganiz...
1154
  		return 0;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1155
  	if (unlikely(wo->wo_flags & WNOWAIT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1156
  		int exit_code = p->exit_code;
f3abd4f95   Thiago Farina   kernel/exit.c: fi...
1157
  		int why;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1158

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159
1160
1161
1162
1163
1164
1165
1166
1167
  		get_task_struct(p);
  		read_unlock(&tasklist_lock);
  		if ((exit_code & 0x7f) == 0) {
  			why = CLD_EXITED;
  			status = exit_code >> 8;
  		} else {
  			why = (exit_code & 0x80) ? CLD_DUMPED : CLD_KILLED;
  			status = exit_code & 0x7f;
  		}
9e8ae01d1   Oleg Nesterov   introduce "struct...
1168
  		return wait_noreap_copyout(wo, p, pid, uid, why, status);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
  	}
  
  	/*
  	 * Try to move the task's state to DEAD
  	 * only one thread is allowed to do this:
  	 */
  	state = xchg(&p->exit_state, EXIT_DEAD);
  	if (state != EXIT_ZOMBIE) {
  		BUG_ON(state != EXIT_DEAD);
  		return 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1180

53b6f9fbd   Oleg Nesterov   ptrace: introduce...
1181
  	traced = ptrace_reparented(p);
befca9677   Oleg Nesterov   ptrace: wait_task...
1182
1183
1184
1185
1186
  	/*
  	 * It can be ptraced but not reparented, check
  	 * !task_detached() to filter out sub-threads.
  	 */
  	if (likely(!traced) && likely(!task_detached(p))) {
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1187
1188
  		struct signal_struct *psig;
  		struct signal_struct *sig;
1f10206cf   Jiri Pirko   getrusage: fill r...
1189
  		unsigned long maxrss;
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
1190
  		cputime_t tgutime, tgstime;
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1191

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
  		/*
  		 * The resource counters for the group leader are in its
  		 * own task_struct.  Those for dead threads in the group
  		 * are in its signal_struct, as are those for the child
  		 * processes it has previously reaped.  All these
  		 * accumulate in the parent's signal_struct c* fields.
  		 *
  		 * We don't bother to take a lock here to protect these
  		 * p->signal fields, because they are only touched by
  		 * __exit_signal, which runs with tasklist_lock
  		 * write-locked anyway, and so is excluded here.  We do
d1e98f429   Oleg Nesterov   ptrace: wait_task...
1203
  		 * need to protect the access to parent->signal fields,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1204
1205
  		 * as other threads in the parent group can be right
  		 * here reaping other children at the same time.
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
1206
1207
1208
1209
  		 *
  		 * We use thread_group_times() to get times for the thread
  		 * group, which consolidates times for all threads in the
  		 * group including the group leader.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1210
  		 */
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
1211
  		thread_group_times(p, &tgutime, &tgstime);
d1e98f429   Oleg Nesterov   ptrace: wait_task...
1212
1213
  		spin_lock_irq(&p->real_parent->sighand->siglock);
  		psig = p->real_parent->signal;
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1214
1215
1216
  		sig = p->signal;
  		psig->cutime =
  			cputime_add(psig->cutime,
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
1217
1218
  			cputime_add(tgutime,
  				    sig->cutime));
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1219
1220
  		psig->cstime =
  			cputime_add(psig->cstime,
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
1221
1222
  			cputime_add(tgstime,
  				    sig->cstime));
9ac52315d   Laurent Vivier   sched: guest CPU ...
1223
1224
1225
1226
1227
  		psig->cgtime =
  			cputime_add(psig->cgtime,
  			cputime_add(p->gtime,
  			cputime_add(sig->gtime,
  				    sig->cgtime)));
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1228
1229
1230
1231
1232
1233
1234
1235
  		psig->cmin_flt +=
  			p->min_flt + sig->min_flt + sig->cmin_flt;
  		psig->cmaj_flt +=
  			p->maj_flt + sig->maj_flt + sig->cmaj_flt;
  		psig->cnvcsw +=
  			p->nvcsw + sig->nvcsw + sig->cnvcsw;
  		psig->cnivcsw +=
  			p->nivcsw + sig->nivcsw + sig->cnivcsw;
6eaeeaba3   Eric Dumazet   getrusage(): fill...
1236
1237
1238
1239
1240
1241
  		psig->cinblock +=
  			task_io_get_inblock(p) +
  			sig->inblock + sig->cinblock;
  		psig->coublock +=
  			task_io_get_oublock(p) +
  			sig->oublock + sig->coublock;
1f10206cf   Jiri Pirko   getrusage: fill r...
1242
1243
1244
  		maxrss = max(sig->maxrss, sig->cmaxrss);
  		if (psig->cmaxrss < maxrss)
  			psig->cmaxrss = maxrss;
5995477ab   Andrea Righi   task IO accountin...
1245
1246
  		task_io_accounting_add(&psig->ioac, &p->ioac);
  		task_io_accounting_add(&psig->ioac, &sig->ioac);
d1e98f429   Oleg Nesterov   ptrace: wait_task...
1247
  		spin_unlock_irq(&p->real_parent->sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1248
1249
1250
1251
1252
1253
1254
  	}
  
  	/*
  	 * Now we are sure this task is interesting, and no other
  	 * thread can reap it because we set its state to EXIT_DEAD.
  	 */
  	read_unlock(&tasklist_lock);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1255
1256
  	retval = wo->wo_rusage
  		? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
1258
  	status = (p->signal->flags & SIGNAL_GROUP_EXIT)
  		? p->signal->group_exit_code : p->exit_code;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1259
1260
1261
1262
  	if (!retval && wo->wo_stat)
  		retval = put_user(status, wo->wo_stat);
  
  	infop = wo->wo_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
  	if (!retval && infop)
  		retval = put_user(SIGCHLD, &infop->si_signo);
  	if (!retval && infop)
  		retval = put_user(0, &infop->si_errno);
  	if (!retval && infop) {
  		int why;
  
  		if ((status & 0x7f) == 0) {
  			why = CLD_EXITED;
  			status >>= 8;
  		} else {
  			why = (status & 0x80) ? CLD_DUMPED : CLD_KILLED;
  			status &= 0x7f;
  		}
  		retval = put_user((short)why, &infop->si_code);
  		if (!retval)
  			retval = put_user(status, &infop->si_status);
  	}
  	if (!retval && infop)
3a515e4a6   Oleg Nesterov   wait_task_continu...
1282
  		retval = put_user(pid, &infop->si_pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1283
  	if (!retval && infop)
c69e8d9c0   David Howells   CRED: Use RCU to ...
1284
  		retval = put_user(uid, &infop->si_uid);
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1285
  	if (!retval)
3a515e4a6   Oleg Nesterov   wait_task_continu...
1286
  		retval = pid;
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1287
1288
  
  	if (traced) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1289
  		write_lock_irq(&tasklist_lock);
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1290
1291
1292
1293
1294
1295
1296
  		/* We dropped tasklist, ptracer could die and untrace */
  		ptrace_unlink(p);
  		/*
  		 * If this is not a detached task, notify the parent.
  		 * If it's still not detached after that, don't release
  		 * it now.
  		 */
d839fd4d2   Oleg Nesterov   ptrace: introduce...
1297
  		if (!task_detached(p)) {
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1298
  			do_notify_parent(p, p->exit_signal);
d839fd4d2   Oleg Nesterov   ptrace: introduce...
1299
  			if (!task_detached(p)) {
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1300
1301
  				p->exit_state = EXIT_ZOMBIE;
  				p = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1302
1303
1304
1305
1306
1307
  			}
  		}
  		write_unlock_irq(&tasklist_lock);
  	}
  	if (p != NULL)
  		release_task(p);
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1308

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1309
1310
  	return retval;
  }
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
  static int *task_stopped_code(struct task_struct *p, bool ptrace)
  {
  	if (ptrace) {
  		if (task_is_stopped_or_traced(p))
  			return &p->exit_code;
  	} else {
  		if (p->signal->flags & SIGNAL_STOP_STOPPED)
  			return &p->signal->group_exit_code;
  	}
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1322
1323
1324
1325
1326
1327
  /*
   * Handle sys_wait4 work for one task in state TASK_STOPPED.  We hold
   * read_lock(&tasklist_lock) on entry.  If we return zero, we still hold
   * the lock and this task is uninteresting.  If we return nonzero, we have
   * released the lock and the system call should return.
   */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1328
1329
  static int wait_task_stopped(struct wait_opts *wo,
  				int ptrace, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1330
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1331
  	struct siginfo __user *infop;
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1332
  	int retval, exit_code, *p_code, why;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1333
  	uid_t uid = 0; /* unneeded, required by compiler */
c89507835   Oleg Nesterov   wait_task_stopped...
1334
  	pid_t pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1335

47918025e   Oleg Nesterov   shift "ptrace imp...
1336
1337
1338
  	/*
  	 * Traditionally we see ptrace'd stopped tasks regardless of options.
  	 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1339
  	if (!ptrace && !(wo->wo_flags & WUNTRACED))
98abed020   Roland McGrath   do_wait reorganiz...
1340
  		return 0;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1341
1342
  	exit_code = 0;
  	spin_lock_irq(&p->sighand->siglock);
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1343
1344
  	p_code = task_stopped_code(p, ptrace);
  	if (unlikely(!p_code))
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1345
  		goto unlock_sig;
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1346
  	exit_code = *p_code;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1347
1348
  	if (!exit_code)
  		goto unlock_sig;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1349
  	if (!unlikely(wo->wo_flags & WNOWAIT))
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1350
  		*p_code = 0;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1351

f362b7324   Daniel J Blueman   Fix unprotected a...
1352
  	uid = task_uid(p);
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1353
1354
1355
  unlock_sig:
  	spin_unlock_irq(&p->sighand->siglock);
  	if (!exit_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
  		return 0;
  
  	/*
  	 * Now we are pretty sure this task is interesting.
  	 * Make sure it doesn't get reaped out from under us while we
  	 * give up the lock and then examine it below.  We don't want to
  	 * keep holding onto the tasklist_lock while we call getrusage and
  	 * possibly take page faults for user memory.
  	 */
  	get_task_struct(p);
6c5f3e7b4   Pavel Emelyanov   Pidns: make full ...
1366
  	pid = task_pid_vnr(p);
f470021ad   Roland McGrath   ptrace children r...
1367
  	why = ptrace ? CLD_TRAPPED : CLD_STOPPED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1368
  	read_unlock(&tasklist_lock);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1369
1370
1371
1372
1373
1374
1375
  	if (unlikely(wo->wo_flags & WNOWAIT))
  		return wait_noreap_copyout(wo, p, pid, uid, why, exit_code);
  
  	retval = wo->wo_rusage
  		? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0;
  	if (!retval && wo->wo_stat)
  		retval = put_user((exit_code << 8) | 0x7f, wo->wo_stat);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1376

9e8ae01d1   Oleg Nesterov   introduce "struct...
1377
  	infop = wo->wo_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1378
1379
1380
1381
1382
  	if (!retval && infop)
  		retval = put_user(SIGCHLD, &infop->si_signo);
  	if (!retval && infop)
  		retval = put_user(0, &infop->si_errno);
  	if (!retval && infop)
6efcae460   Roland McGrath   Fix waitid si_cod...
1383
  		retval = put_user((short)why, &infop->si_code);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1384
1385
1386
  	if (!retval && infop)
  		retval = put_user(exit_code, &infop->si_status);
  	if (!retval && infop)
c89507835   Oleg Nesterov   wait_task_stopped...
1387
  		retval = put_user(pid, &infop->si_pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1388
  	if (!retval && infop)
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1389
  		retval = put_user(uid, &infop->si_uid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1390
  	if (!retval)
c89507835   Oleg Nesterov   wait_task_stopped...
1391
  		retval = pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
  	put_task_struct(p);
  
  	BUG_ON(!retval);
  	return retval;
  }
  
  /*
   * Handle do_wait work for one task in a live, non-stopped state.
   * read_lock(&tasklist_lock) on entry.  If we return zero, we still hold
   * the lock and this task is uninteresting.  If we return nonzero, we have
   * released the lock and the system call should return.
   */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1404
  static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1405
1406
1407
1408
  {
  	int retval;
  	pid_t pid;
  	uid_t uid;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1409
  	if (!unlikely(wo->wo_flags & WCONTINUED))
98abed020   Roland McGrath   do_wait reorganiz...
1410
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1411
1412
1413
1414
1415
1416
1417
1418
1419
  	if (!(p->signal->flags & SIGNAL_STOP_CONTINUED))
  		return 0;
  
  	spin_lock_irq(&p->sighand->siglock);
  	/* Re-check with the lock held.  */
  	if (!(p->signal->flags & SIGNAL_STOP_CONTINUED)) {
  		spin_unlock_irq(&p->sighand->siglock);
  		return 0;
  	}
9e8ae01d1   Oleg Nesterov   introduce "struct...
1420
  	if (!unlikely(wo->wo_flags & WNOWAIT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1421
  		p->signal->flags &= ~SIGNAL_STOP_CONTINUED;
f362b7324   Daniel J Blueman   Fix unprotected a...
1422
  	uid = task_uid(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1423
  	spin_unlock_irq(&p->sighand->siglock);
6c5f3e7b4   Pavel Emelyanov   Pidns: make full ...
1424
  	pid = task_pid_vnr(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1425
1426
  	get_task_struct(p);
  	read_unlock(&tasklist_lock);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1427
1428
1429
  	if (!wo->wo_info) {
  		retval = wo->wo_rusage
  			? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1430
  		put_task_struct(p);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1431
1432
  		if (!retval && wo->wo_stat)
  			retval = put_user(0xffff, wo->wo_stat);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1433
  		if (!retval)
3a515e4a6   Oleg Nesterov   wait_task_continu...
1434
  			retval = pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435
  	} else {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1436
1437
  		retval = wait_noreap_copyout(wo, p, pid, uid,
  					     CLD_CONTINUED, SIGCONT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1438
1439
1440
1441
1442
  		BUG_ON(retval == 0);
  	}
  
  	return retval;
  }
98abed020   Roland McGrath   do_wait reorganiz...
1443
1444
1445
  /*
   * Consider @p for a wait by @parent.
   *
9e8ae01d1   Oleg Nesterov   introduce "struct...
1446
   * -ECHILD should be in ->notask_error before the first call.
98abed020   Roland McGrath   do_wait reorganiz...
1447
1448
   * Returns nonzero for a final return, when we have unlocked tasklist_lock.
   * Returns zero if the search for a child should continue;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1449
   * then ->notask_error is 0 if @p is an eligible child,
14dd0b814   Roland McGrath   do_wait: return s...
1450
   * or another error from security_task_wait(), or still -ECHILD.
98abed020   Roland McGrath   do_wait reorganiz...
1451
   */
b6e763f07   Oleg Nesterov   wait_consider_tas...
1452
1453
  static int wait_consider_task(struct wait_opts *wo, int ptrace,
  				struct task_struct *p)
98abed020   Roland McGrath   do_wait reorganiz...
1454
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1455
  	int ret = eligible_child(wo, p);
14dd0b814   Roland McGrath   do_wait: return s...
1456
  	if (!ret)
98abed020   Roland McGrath   do_wait reorganiz...
1457
  		return ret;
a2322e1d2   Oleg Nesterov   do_wait() wakeup ...
1458
  	ret = security_task_wait(p);
14dd0b814   Roland McGrath   do_wait: return s...
1459
1460
1461
1462
1463
1464
1465
1466
  	if (unlikely(ret < 0)) {
  		/*
  		 * If we have not yet seen any eligible child,
  		 * then let this error code replace -ECHILD.
  		 * A permission error will give the user a clue
  		 * to look for security policy problems, rather
  		 * than for mysterious wait bugs.
  		 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1467
1468
  		if (wo->notask_error)
  			wo->notask_error = ret;
78a3d9d56   Oleg Nesterov   do_wait: do take ...
1469
  		return 0;
14dd0b814   Roland McGrath   do_wait: return s...
1470
  	}
5cb114468   Oleg Nesterov   ptrace: do not us...
1471
  	if (likely(!ptrace) && unlikely(task_ptrace(p))) {
f470021ad   Roland McGrath   ptrace children r...
1472
1473
1474
1475
  		/*
  		 * This child is hidden by ptrace.
  		 * We aren't allowed to see it now, but eventually we will.
  		 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1476
  		wo->notask_error = 0;
f470021ad   Roland McGrath   ptrace children r...
1477
1478
  		return 0;
  	}
98abed020   Roland McGrath   do_wait reorganiz...
1479
1480
1481
1482
1483
1484
1485
  	if (p->exit_state == EXIT_DEAD)
  		return 0;
  
  	/*
  	 * We don't reap group leaders with subthreads.
  	 */
  	if (p->exit_state == EXIT_ZOMBIE && !delay_group_leader(p))
9e8ae01d1   Oleg Nesterov   introduce "struct...
1486
  		return wait_task_zombie(wo, p);
98abed020   Roland McGrath   do_wait reorganiz...
1487
1488
1489
1490
1491
  
  	/*
  	 * It's stopped or running now, so it might
  	 * later continue, exit, or stop again.
  	 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1492
  	wo->notask_error = 0;
98abed020   Roland McGrath   do_wait reorganiz...
1493

90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1494
  	if (task_stopped_code(p, ptrace))
9e8ae01d1   Oleg Nesterov   introduce "struct...
1495
  		return wait_task_stopped(wo, ptrace, p);
98abed020   Roland McGrath   do_wait reorganiz...
1496

9e8ae01d1   Oleg Nesterov   introduce "struct...
1497
  	return wait_task_continued(wo, p);
98abed020   Roland McGrath   do_wait reorganiz...
1498
1499
1500
1501
1502
  }
  
  /*
   * Do the work of do_wait() for one thread in the group, @tsk.
   *
9e8ae01d1   Oleg Nesterov   introduce "struct...
1503
   * -ECHILD should be in ->notask_error before the first call.
98abed020   Roland McGrath   do_wait reorganiz...
1504
1505
   * Returns nonzero for a final return, when we have unlocked tasklist_lock.
   * Returns zero if the search for a child should continue; then
9e8ae01d1   Oleg Nesterov   introduce "struct...
1506
   * ->notask_error is 0 if there were any eligible children,
14dd0b814   Roland McGrath   do_wait: return s...
1507
   * or another error from security_task_wait(), or still -ECHILD.
98abed020   Roland McGrath   do_wait reorganiz...
1508
   */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1509
  static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk)
98abed020   Roland McGrath   do_wait reorganiz...
1510
1511
1512
1513
  {
  	struct task_struct *p;
  
  	list_for_each_entry(p, &tsk->children, sibling) {
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
1514
1515
1516
  		int ret = wait_consider_task(wo, 0, p);
  		if (ret)
  			return ret;
98abed020   Roland McGrath   do_wait reorganiz...
1517
1518
1519
1520
  	}
  
  	return 0;
  }
9e8ae01d1   Oleg Nesterov   introduce "struct...
1521
  static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk)
98abed020   Roland McGrath   do_wait reorganiz...
1522
1523
  {
  	struct task_struct *p;
f470021ad   Roland McGrath   ptrace children r...
1524
  	list_for_each_entry(p, &tsk->ptraced, ptrace_entry) {
b6e763f07   Oleg Nesterov   wait_consider_tas...
1525
  		int ret = wait_consider_task(wo, 1, p);
f470021ad   Roland McGrath   ptrace children r...
1526
  		if (ret)
98abed020   Roland McGrath   do_wait reorganiz...
1527
  			return ret;
98abed020   Roland McGrath   do_wait reorganiz...
1528
1529
1530
1531
  	}
  
  	return 0;
  }
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1532
1533
1534
1535
1536
1537
  static int child_wait_callback(wait_queue_t *wait, unsigned mode,
  				int sync, void *key)
  {
  	struct wait_opts *wo = container_of(wait, struct wait_opts,
  						child_wait);
  	struct task_struct *p = key;
5c01ba49e   Oleg Nesterov   do_wait-wakeup-op...
1538
  	if (!eligible_pid(wo, p))
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1539
  		return 0;
b4fe51823   Oleg Nesterov   do_wait() wakeup ...
1540
1541
  	if ((wo->wo_flags & __WNOTHREAD) && wait->private != p->parent)
  		return 0;
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1542
1543
  	return default_wake_function(wait, mode, sync, key);
  }
a7f0765ed   Oleg Nesterov   ptrace: __ptrace_...
1544
1545
  void __wake_up_parent(struct task_struct *p, struct task_struct *parent)
  {
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1546
1547
  	__wake_up_sync_key(&parent->signal->wait_chldexit,
  				TASK_INTERRUPTIBLE, 1, p);
a7f0765ed   Oleg Nesterov   ptrace: __ptrace_...
1548
  }
9e8ae01d1   Oleg Nesterov   introduce "struct...
1549
  static long do_wait(struct wait_opts *wo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1550
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1551
  	struct task_struct *tsk;
98abed020   Roland McGrath   do_wait reorganiz...
1552
  	int retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553

9e8ae01d1   Oleg Nesterov   introduce "struct...
1554
  	trace_sched_process_wait(wo->wo_pid);
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
1555

0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1556
1557
1558
  	init_waitqueue_func_entry(&wo->child_wait, child_wait_callback);
  	wo->child_wait.private = current;
  	add_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559
  repeat:
98abed020   Roland McGrath   do_wait reorganiz...
1560
1561
  	/*
  	 * If there is nothing that can match our critiera just get out.
9e8ae01d1   Oleg Nesterov   introduce "struct...
1562
1563
1564
  	 * We will clear ->notask_error to zero if we see any child that
  	 * might later match our criteria, even if we are not able to reap
  	 * it yet.
98abed020   Roland McGrath   do_wait reorganiz...
1565
  	 */
64a16caf5   Oleg Nesterov   do_wait: simplify...
1566
  	wo->notask_error = -ECHILD;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1567
1568
  	if ((wo->wo_type < PIDTYPE_MAX) &&
  	   (!wo->wo_pid || hlist_empty(&wo->wo_pid->tasks[wo->wo_type])))
64a16caf5   Oleg Nesterov   do_wait: simplify...
1569
  		goto notask;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1570

f95d39d10   Oleg Nesterov   do_wait: fix the ...
1571
  	set_current_state(TASK_INTERRUPTIBLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1572
1573
1574
  	read_lock(&tasklist_lock);
  	tsk = current;
  	do {
64a16caf5   Oleg Nesterov   do_wait: simplify...
1575
1576
1577
  		retval = do_wait_thread(wo, tsk);
  		if (retval)
  			goto end;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1578

64a16caf5   Oleg Nesterov   do_wait: simplify...
1579
1580
  		retval = ptrace_do_wait(wo, tsk);
  		if (retval)
98abed020   Roland McGrath   do_wait reorganiz...
1581
  			goto end;
98abed020   Roland McGrath   do_wait reorganiz...
1582

9e8ae01d1   Oleg Nesterov   introduce "struct...
1583
  		if (wo->wo_flags & __WNOTHREAD)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1584
  			break;
a3f6dfb72   Oleg Nesterov   do_wait: kill the...
1585
  	} while_each_thread(current, tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1586
  	read_unlock(&tasklist_lock);
f2cc3eb13   Oleg Nesterov   do_wait: fix secu...
1587

64a16caf5   Oleg Nesterov   do_wait: simplify...
1588
  notask:
9e8ae01d1   Oleg Nesterov   introduce "struct...
1589
1590
  	retval = wo->notask_error;
  	if (!retval && !(wo->wo_flags & WNOHANG)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1591
  		retval = -ERESTARTSYS;
98abed020   Roland McGrath   do_wait reorganiz...
1592
1593
1594
1595
  		if (!signal_pending(current)) {
  			schedule();
  			goto repeat;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1596
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1597
  end:
f95d39d10   Oleg Nesterov   do_wait: fix the ...
1598
  	__set_current_state(TASK_RUNNING);
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1599
  	remove_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1600
1601
  	return retval;
  }
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
1602
1603
  SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
  		infop, int, options, struct rusage __user *, ru)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1604
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1605
  	struct wait_opts wo;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1606
1607
  	struct pid *pid = NULL;
  	enum pid_type type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
1609
1610
1611
1612
1613
1614
1615
1616
  	long ret;
  
  	if (options & ~(WNOHANG|WNOWAIT|WEXITED|WSTOPPED|WCONTINUED))
  		return -EINVAL;
  	if (!(options & (WEXITED|WSTOPPED|WCONTINUED)))
  		return -EINVAL;
  
  	switch (which) {
  	case P_ALL:
161550d74   Eric W. Biederman   pid: sys_wait... ...
1617
  		type = PIDTYPE_MAX;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1618
1619
  		break;
  	case P_PID:
161550d74   Eric W. Biederman   pid: sys_wait... ...
1620
1621
  		type = PIDTYPE_PID;
  		if (upid <= 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1622
1623
1624
  			return -EINVAL;
  		break;
  	case P_PGID:
161550d74   Eric W. Biederman   pid: sys_wait... ...
1625
1626
  		type = PIDTYPE_PGID;
  		if (upid <= 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1627
  			return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1628
1629
1630
1631
  		break;
  	default:
  		return -EINVAL;
  	}
161550d74   Eric W. Biederman   pid: sys_wait... ...
1632
1633
  	if (type < PIDTYPE_MAX)
  		pid = find_get_pid(upid);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1634
1635
1636
1637
1638
1639
1640
1641
  
  	wo.wo_type	= type;
  	wo.wo_pid	= pid;
  	wo.wo_flags	= options;
  	wo.wo_info	= infop;
  	wo.wo_stat	= NULL;
  	wo.wo_rusage	= ru;
  	ret = do_wait(&wo);
dfe16dfa4   Vitaly Mayatskikh   do_wait: fix sys_...
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
  
  	if (ret > 0) {
  		ret = 0;
  	} else if (infop) {
  		/*
  		 * For a WNOHANG return, clear out all the fields
  		 * we would set so the user can easily tell the
  		 * difference.
  		 */
  		if (!ret)
  			ret = put_user(0, &infop->si_signo);
  		if (!ret)
  			ret = put_user(0, &infop->si_errno);
  		if (!ret)
  			ret = put_user(0, &infop->si_code);
  		if (!ret)
  			ret = put_user(0, &infop->si_pid);
  		if (!ret)
  			ret = put_user(0, &infop->si_uid);
  		if (!ret)
  			ret = put_user(0, &infop->si_status);
  	}
161550d74   Eric W. Biederman   pid: sys_wait... ...
1664
  	put_pid(pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1665
1666
  
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
1667
  	asmlinkage_protect(5, ret, which, upid, infop, options, ru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1668
1669
  	return ret;
  }
754fe8d29   Heiko Carstens   [CVE-2009-0029] S...
1670
1671
  SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
  		int, options, struct rusage __user *, ru)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1672
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1673
  	struct wait_opts wo;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1674
1675
  	struct pid *pid = NULL;
  	enum pid_type type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1676
1677
1678
1679
1680
  	long ret;
  
  	if (options & ~(WNOHANG|WUNTRACED|WCONTINUED|
  			__WNOTHREAD|__WCLONE|__WALL))
  		return -EINVAL;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1681
1682
1683
1684
1685
1686
1687
1688
  
  	if (upid == -1)
  		type = PIDTYPE_MAX;
  	else if (upid < 0) {
  		type = PIDTYPE_PGID;
  		pid = find_get_pid(-upid);
  	} else if (upid == 0) {
  		type = PIDTYPE_PGID;
2ae448efc   Oleg Nesterov   pids: improve get...
1689
  		pid = get_task_pid(current, PIDTYPE_PGID);
161550d74   Eric W. Biederman   pid: sys_wait... ...
1690
1691
1692
1693
  	} else /* upid > 0 */ {
  		type = PIDTYPE_PID;
  		pid = find_get_pid(upid);
  	}
9e8ae01d1   Oleg Nesterov   introduce "struct...
1694
1695
1696
1697
1698
1699
1700
  	wo.wo_type	= type;
  	wo.wo_pid	= pid;
  	wo.wo_flags	= options | WEXITED;
  	wo.wo_info	= NULL;
  	wo.wo_stat	= stat_addr;
  	wo.wo_rusage	= ru;
  	ret = do_wait(&wo);
161550d74   Eric W. Biederman   pid: sys_wait... ...
1701
  	put_pid(pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1702
1703
  
  	/* avoid REGPARM breakage on x86: */
54a015104   Roland McGrath   asmlinkage_protec...
1704
  	asmlinkage_protect(4, ret, upid, stat_addr, options, ru);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1705
1706
1707
1708
1709
1710
1711
1712
1713
  	return ret;
  }
  
  #ifdef __ARCH_WANT_SYS_WAITPID
  
  /*
   * sys_waitpid() remains for compatibility. waitpid() should be
   * implemented by calling sys_wait4() from libc.a.
   */
17da2bd90   Heiko Carstens   [CVE-2009-0029] S...
1714
  SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1715
1716
1717
1718
1719
  {
  	return sys_wait4(pid, stat_addr, options, NULL);
  }
  
  #endif