Blame view

kernel/exit.c 44.3 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
  #include <linux/mm.h>
  #include <linux/slab.h>
4eb5aaa3a   Ingo Molnar   sched/headers: Pr...
8
  #include <linux/sched/autogroup.h>
6e84f3152   Ingo Molnar   sched/headers: Pr...
9
  #include <linux/sched/mm.h>
03441a348   Ingo Molnar   sched/headers: Pr...
10
  #include <linux/sched/stat.h>
299300258   Ingo Molnar   sched/headers: Pr...
11
  #include <linux/sched/task.h>
68db0cf10   Ingo Molnar   sched/headers: Pr...
12
  #include <linux/sched/task_stack.h>
32ef5517c   Ingo Molnar   sched/headers: Pr...
13
  #include <linux/sched/cputime.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  #include <linux/interrupt.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
  #include <linux/module.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
16
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
  #include <linux/completion.h>
  #include <linux/personality.h>
  #include <linux/tty.h>
da9cbc873   Jens Axboe   block: blkdev.h c...
20
  #include <linux/iocontext.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  #include <linux/key.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  #include <linux/cpu.h>
  #include <linux/acct.h>
8f0ab5147   Jay Lan   [PATCH] csa: conv...
24
  #include <linux/tsacct_kern.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  #include <linux/file.h>
9f3acc314   Al Viro   [PATCH] split lin...
26
  #include <linux/fdtable.h>
80d26af89   Mandeep Singh Baines   coredump: use a f...
27
  #include <linux/freezer.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  #include <linux/binfmts.h>
ab516013a   Serge E. Hallyn   [PATCH] namespace...
29
  #include <linux/nsproxy.h>
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
30
  #include <linux/pid_namespace.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
  #include <linux/ptrace.h>
  #include <linux/profile.h>
  #include <linux/mount.h>
  #include <linux/proc_fs.h>
49d769d52   Eric W. Biederman   Change reparent_t...
35
  #include <linux/kthread.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  #include <linux/mempolicy.h>
c757249af   Shailabh Nagar   [PATCH] per-task-...
37
  #include <linux/taskstats_kern.h>
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
38
  #include <linux/delayacct.h>
b4f48b636   Paul Menage   Task Control Grou...
39
  #include <linux/cgroup.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  #include <linux/syscalls.h>
7ed20e1ad   Jesper Juhl   [PATCH] convert t...
41
  #include <linux/signal.h>
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
42
  #include <linux/posix-timers.h>
9f46080c4   Matt Helsley   [PATCH] Process E...
43
  #include <linux/cn_proc.h>
de5097c2e   Ingo Molnar   [PATCH] mutex sub...
44
  #include <linux/mutex.h>
0771dfefc   Ingo Molnar   [PATCH] lightweig...
45
  #include <linux/futex.h>
b92ce5589   Jens Axboe   [PATCH] splice: a...
46
  #include <linux/pipe_fs_i.h>
fa84cb935   Al Viro   [PATCH] move call...
47
  #include <linux/audit.h> /* for audit_free() */
83cc5ed3c   Adrian Bunk   [PATCH] kernel/sy...
48
  #include <linux/resource.h>
0d67a46df   David Howells   [PATCH] BLOCK: Re...
49
  #include <linux/blkdev.h>
6eaeeaba3   Eric Dumazet   getrusage(): fill...
50
  #include <linux/task_io_accounting_ops.h>
30199f5a4   Roland McGrath   tracehook: exit
51
  #include <linux/tracehook.h>
5ad4e53bd   Al Viro   Get rid of indire...
52
  #include <linux/fs_struct.h>
d84f4f992   David Howells   CRED: Inaugurate ...
53
  #include <linux/init_task.h>
cdd6c482c   Ingo Molnar   perf: Do the big ...
54
  #include <linux/perf_event.h>
ad8d75fff   Steven Rostedt   tracing/events: m...
55
  #include <trace/events/sched.h>
24f1e32c6   Frederic Weisbecker   hw-breakpoints: R...
56
  #include <linux/hw_breakpoint.h>
3d5992d2a   Ying Han   oom: add per-mm o...
57
  #include <linux/oom.h>
54848d73f   Wu Fengguang   writeback: charge...
58
  #include <linux/writeback.h>
404015308   Al Viro   security: trim se...
59
  #include <linux/shm.h>
5c9a8750a   Dmitry Vyukov   kernel: add kcov ...
60
  #include <linux/kcov.h>
53d3eaa31   Nicolas Pitre   posix_cpu_timers:...
61
  #include <linux/random.h>
8f95c90ce   Davidlohr Bueso   sched/wait, RCU: ...
62
  #include <linux/rcuwait.h>
7e95a2259   Al Viro   move compat wait4...
63
  #include <linux/compat.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64

7c0f6ba68   Linus Torvalds   Replace <asm/uacc...
65
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
  #include <asm/unistd.h>
  #include <asm/pgtable.h>
  #include <asm/mmu_context.h>
d40e48e02   Oleg Nesterov   exit: __exit_sign...
69
  static void __unhash_process(struct task_struct *p, bool group_dead)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
  {
  	nr_threads--;
50d75f8da   Oleg Nesterov   pidns: find_new_r...
72
  	detach_pid(p, PIDTYPE_PID);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
73
  	if (group_dead) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
  		detach_pid(p, PIDTYPE_PGID);
  		detach_pid(p, PIDTYPE_SID);
c97d98931   Oleg Nesterov   [PATCH] kill SET_...
76

5e85d4abe   Eric W. Biederman   [PATCH] task: Mak...
77
  		list_del_rcu(&p->tasks);
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
78
  		list_del_init(&p->sibling);
909ea9646   Christoph Lameter   core: Replace __g...
79
  		__this_cpu_dec(process_counts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  	}
47e65328a   Oleg Nesterov   [PATCH] pids: kil...
81
  	list_del_rcu(&p->thread_group);
0c740d0af   Oleg Nesterov   introduce for_eac...
82
  	list_del_rcu(&p->thread_node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  }
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
84
85
86
87
88
89
  /*
   * 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...
90
  	bool group_dead = thread_group_leader(tsk);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
91
  	struct sighand_struct *sighand;
4ada856fb   Oleg Nesterov   signals: clear si...
92
  	struct tty_struct *uninitialized_var(tty);
5613fda9a   Frederic Weisbecker   sched/cputime: Co...
93
  	u64 utime, stime;
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
94

d11c563dd   Paul E. McKenney   sched: Use lockde...
95
  	sighand = rcu_dereference_check(tsk->sighand,
db1466b3e   Paul E. McKenney   rcu: Use wrapper ...
96
  					lockdep_tasklist_lock_is_held());
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
97
  	spin_lock(&sighand->siglock);
baa73d9e4   Nicolas Pitre   posix-timers: Mak...
98
  #ifdef CONFIG_POSIX_TIMERS
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
99
  	posix_cpu_timers_exit(tsk);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
100
  	if (group_dead) {
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
101
  		posix_cpu_timers_exit_group(tsk);
4a5999429   Oleg Nesterov   exit: avoid sig->...
102
  	} else {
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
103
  		/*
e0a702171   Oleg Nesterov   posix-cpu-timers:...
104
105
106
107
108
109
  		 * 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);
baa73d9e4   Nicolas Pitre   posix-timers: Mak...
110
111
  	}
  #endif
e0a702171   Oleg Nesterov   posix-cpu-timers:...
112

baa73d9e4   Nicolas Pitre   posix-timers: Mak...
113
114
115
116
  	if (group_dead) {
  		tty = sig->tty;
  		sig->tty = NULL;
  	} else {
e0a702171   Oleg Nesterov   posix-cpu-timers:...
117
  		/*
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
118
119
120
  		 * If there is any task waiting for the group exit
  		 * then notify it:
  		 */
d344193a0   Oleg Nesterov   exit: avoid sig->...
121
  		if (sig->notify_count > 0 && !--sig->notify_count)
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
122
  			wake_up_process(sig->group_exit_task);
6db840fa7   Oleg Nesterov   exec: RT sub-thre...
123

6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
124
125
  		if (tsk == sig->curr_target)
  			sig->curr_target = next_thread(tsk);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
126
  	}
53d3eaa31   Nicolas Pitre   posix_cpu_timers:...
127
128
  	add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
  			      sizeof(unsigned long long));
90ed9cbe7   Rik van Riel   exit: Always reap...
129
  	/*
26e75b5c3   Oleg Nesterov   exit: release_tas...
130
131
132
133
  	 * Accumulate here the counters for all threads as they die. We could
  	 * skip the group leader because it is the last user of signal_struct,
  	 * but we want to avoid the race with thread_group_cputime() which can
  	 * see the empty ->thread_head list.
90ed9cbe7   Rik van Riel   exit: Always reap...
134
135
  	 */
  	task_cputime(tsk, &utime, &stime);
e78c34967   Rik van Riel   time, signal: Pro...
136
  	write_seqlock(&sig->stats_lock);
90ed9cbe7   Rik van Riel   exit: Always reap...
137
138
139
140
141
142
143
144
145
146
147
  	sig->utime += utime;
  	sig->stime += stime;
  	sig->gtime += task_gtime(tsk);
  	sig->min_flt += tsk->min_flt;
  	sig->maj_flt += tsk->maj_flt;
  	sig->nvcsw += tsk->nvcsw;
  	sig->nivcsw += tsk->nivcsw;
  	sig->inblock += task_io_get_inblock(tsk);
  	sig->oublock += task_io_get_oublock(tsk);
  	task_io_accounting_add(&sig->ioac, &tsk->ioac);
  	sig->sum_sched_runtime += tsk->se.sum_exec_runtime;
b3ac022cb   Oleg Nesterov   proc: turn signal...
148
  	sig->nr_threads--;
d40e48e02   Oleg Nesterov   exit: __exit_sign...
149
  	__unhash_process(tsk, group_dead);
e78c34967   Rik van Riel   time, signal: Pro...
150
  	write_sequnlock(&sig->stats_lock);
5876700cd   Oleg Nesterov   [PATCH] do __unha...
151

da7978b03   Oleg Nesterov   signals: fix sigq...
152
153
154
155
156
  	/*
  	 * 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 _...
157
  	tsk->sighand = NULL;
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
158
  	spin_unlock(&sighand->siglock);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
159

a7e5328a0   Oleg Nesterov   [PATCH] cleanup _...
160
  	__cleanup_sighand(sighand);
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
161
  	clear_tsk_thread_flag(tsk, TIF_SIGPENDING);
d40e48e02   Oleg Nesterov   exit: __exit_sign...
162
  	if (group_dead) {
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
163
  		flush_sigqueue(&sig->shared_pending);
4ada856fb   Oleg Nesterov   signals: clear si...
164
  		tty_kref_put(tty);
6a14c5c9d   Oleg Nesterov   [PATCH] move __ex...
165
166
  	}
  }
8c7904a00   Eric W. Biederman   [PATCH] task: RCU...
167
168
  static void delayed_put_task_struct(struct rcu_head *rhp)
  {
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
169
  	struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
4e231c796   Peter Zijlstra   perf: Fix up dela...
170
  	perf_event_delayed_put(tsk);
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
171
172
  	trace_sched_process_free(tsk);
  	put_task_struct(tsk);
8c7904a00   Eric W. Biederman   [PATCH] task: RCU...
173
  }
f470021ad   Roland McGrath   ptrace children r...
174

a0be55dee   Ionut Alexa   kernel/exit.c: fi...
175
  void release_task(struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  {
36c8b5868   Ingo Molnar   [PATCH] sched: cl...
177
  	struct task_struct *leader;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  	int zap_leader;
1f09f9749   Oleg Nesterov   [PATCH] release_t...
179
  repeat:
c69e8d9c0   David Howells   CRED: Use RCU to ...
180
  	/* don't need to get the RCU readlock here - the process is dead and
d11c563dd   Paul E. McKenney   sched: Use lockde...
181
182
  	 * can't be modifying its own credentials. But shut RCU-lockdep up */
  	rcu_read_lock();
c69e8d9c0   David Howells   CRED: Use RCU to ...
183
  	atomic_dec(&__task_cred(p)->user->processes);
d11c563dd   Paul E. McKenney   sched: Use lockde...
184
  	rcu_read_unlock();
c69e8d9c0   David Howells   CRED: Use RCU to ...
185

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
  	write_lock_irq(&tasklist_lock);
a288eecce   Tejun Heo   ptrace: kill triv...
189
  	ptrace_release_task(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
190
  	__exit_signal(p);
35f5cad8c   Oleg Nesterov   [PATCH] revert "O...
191

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
193
194
195
196
197
198
  	/*
  	 * 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;
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
199
200
  	if (leader != p && thread_group_empty(leader)
  			&& leader->exit_state == EXIT_ZOMBIE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
203
204
  		/*
  		 * 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.
dae33574d   Roland McGrath   tracehook: releas...
205
  		 */
867734737   Oleg Nesterov   make do_notify_pa...
206
  		zap_leader = do_notify_parent(leader, leader->exit_signal);
dae33574d   Roland McGrath   tracehook: releas...
207
208
  		if (zap_leader)
  			leader->exit_state = EXIT_DEAD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
  	write_unlock_irq(&tasklist_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
  	release_thread(p);
8c7904a00   Eric W. Biederman   [PATCH] task: RCU...
212
  	call_rcu(&p->rcu, delayed_put_task_struct);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
215
216
217
  
  	p = leader;
  	if (unlikely(zap_leader))
  		goto repeat;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
  /*
150593bf8   Oleg Nesterov   sched/api: Introd...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
   * Note that if this function returns a valid task_struct pointer (!NULL)
   * task->usage must remain >0 for the duration of the RCU critical section.
   */
  struct task_struct *task_rcu_dereference(struct task_struct **ptask)
  {
  	struct sighand_struct *sighand;
  	struct task_struct *task;
  
  	/*
  	 * We need to verify that release_task() was not called and thus
  	 * delayed_put_task_struct() can't run and drop the last reference
  	 * before rcu_read_unlock(). We check task->sighand != NULL,
  	 * but we can read the already freed and reused memory.
  	 */
  retry:
  	task = rcu_dereference(*ptask);
  	if (!task)
  		return NULL;
  
  	probe_kernel_address(&task->sighand, sighand);
  
  	/*
  	 * Pairs with atomic_dec_and_test() in put_task_struct(). If this task
  	 * was already freed we can not miss the preceding update of this
  	 * pointer.
  	 */
  	smp_rmb();
  	if (unlikely(task != READ_ONCE(*ptask)))
  		goto retry;
  
  	/*
  	 * We've re-checked that "task == *ptask", now we have two different
  	 * cases:
  	 *
  	 * 1. This is actually the same task/task_struct. In this case
  	 *    sighand != NULL tells us it is still alive.
  	 *
  	 * 2. This is another task which got the same memory for task_struct.
  	 *    We can't know this of course, and we can not trust
  	 *    sighand != NULL.
  	 *
  	 *    In this case we actually return a random value, but this is
  	 *    correct.
  	 *
  	 *    If we return NULL - we can pretend that we actually noticed that
  	 *    *ptask was updated when the previous task has exited. Or pretend
  	 *    that probe_slab_address(&sighand) reads NULL.
  	 *
  	 *    If we return the new task (because sighand is not NULL for any
  	 *    reason) - this is fine too. This (new) task can't go away before
  	 *    another gp pass.
  	 *
  	 *    And note: We could even eliminate the false positive if re-read
  	 *    task->sighand once again to avoid the falsely NULL. But this case
  	 *    is very unlikely so we don't care.
  	 */
  	if (!sighand)
  		return NULL;
  
  	return task;
  }
8f95c90ce   Davidlohr Bueso   sched/wait, RCU: ...
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
  void rcuwait_wake_up(struct rcuwait *w)
  {
  	struct task_struct *task;
  
  	rcu_read_lock();
  
  	/*
  	 * Order condition vs @task, such that everything prior to the load
  	 * of @task is visible. This is the condition as to why the user called
  	 * rcuwait_trywake() in the first place. Pairs with set_current_state()
  	 * barrier (A) in rcuwait_wait_event().
  	 *
  	 *    WAIT                WAKE
  	 *    [S] tsk = current	  [S] cond = true
  	 *        MB (A)	      MB (B)
  	 *    [L] cond		  [L] tsk
  	 */
  	smp_rmb(); /* (B) */
  
  	/*
  	 * Avoid using task_rcu_dereference() magic as long as we are careful,
  	 * see comment in rcuwait_wait_event() regarding ->exit_state.
  	 */
  	task = rcu_dereference(w->task);
  	if (task)
  		wake_up_process(task);
  	rcu_read_unlock();
  }
150593bf8   Oleg Nesterov   sched/api: Introd...
308
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
311
312
313
314
315
   * 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?"
   */
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
316
317
  static int will_become_orphaned_pgrp(struct pid *pgrp,
  					struct task_struct *ignored_task)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
  {
  	struct task_struct *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320

0475ac084   Eric W. Biederman   [PATCH] pid: use ...
321
  	do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
05e83df62   Oleg Nesterov   will_become_orpha...
322
323
324
  		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
325
  			continue;
05e83df62   Oleg Nesterov   will_become_orpha...
326

0475ac084   Eric W. Biederman   [PATCH] pid: use ...
327
  		if (task_pgrp(p->real_parent) != pgrp &&
05e83df62   Oleg Nesterov   will_become_orpha...
328
329
  		    task_session(p->real_parent) == task_session(p))
  			return 0;
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
330
  	} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
05e83df62   Oleg Nesterov   will_become_orpha...
331
332
  
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
  }
3e7cd6c41   Eric W. Biederman   [PATCH] pid: repl...
334
  int is_current_pgrp_orphaned(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
336
337
338
  {
  	int retval;
  
  	read_lock(&tasklist_lock);
3e7cd6c41   Eric W. Biederman   [PATCH] pid: repl...
339
  	retval = will_become_orphaned_pgrp(task_pgrp(current), NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
341
342
343
  	read_unlock(&tasklist_lock);
  
  	return retval;
  }
961c4675c   Oleg Nesterov   has_stopped_jobs:...
344
  static bool has_stopped_jobs(struct pid *pgrp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
345
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
346
  	struct task_struct *p;
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
347
  	do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
961c4675c   Oleg Nesterov   has_stopped_jobs:...
348
349
  		if (p->signal->flags & SIGNAL_STOP_STOPPED)
  			return true;
0475ac084   Eric W. Biederman   [PATCH] pid: use ...
350
  	} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
961c4675c   Oleg Nesterov   has_stopped_jobs:...
351
352
  
  	return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  }
f49ee505b   Oleg Nesterov   introduce kill_or...
354
355
356
357
358
359
360
361
362
363
364
365
  /*
   * 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)
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
366
367
368
  		/* exit: our father is in a different pgrp than
  		 * we are and we were the only connection outside.
  		 */
f49ee505b   Oleg Nesterov   introduce kill_or...
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
  		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);
  	}
  }
f98bafa06   Oleg Nesterov   memcg: kill CONFI...
384
  #ifdef CONFIG_MEMCG
cf475ad28   Balbir Singh   cgroups: add an o...
385
  /*
733eda7ac   KAMEZAWA Hiroyuki   memcg: clear mm->...
386
   * A task is exiting.   If it owned this mm, find a new owner for the mm.
cf475ad28   Balbir Singh   cgroups: add an o...
387
   */
cf475ad28   Balbir Singh   cgroups: add an o...
388
389
390
391
392
  void mm_update_next_owner(struct mm_struct *mm)
  {
  	struct task_struct *c, *g, *p = current;
  
  retry:
733eda7ac   KAMEZAWA Hiroyuki   memcg: clear mm->...
393
394
395
396
397
  	/*
  	 * If the exiting or execing task is not the owner, it's
  	 * someone else's problem.
  	 */
  	if (mm->owner != p)
cf475ad28   Balbir Singh   cgroups: add an o...
398
  		return;
733eda7ac   KAMEZAWA Hiroyuki   memcg: clear mm->...
399
400
401
402
403
404
405
406
407
  	/*
  	 * The current owner is exiting/execing and there are no other
  	 * candidates.  Do not leave the mm pointing to a possibly
  	 * freed task structure.
  	 */
  	if (atomic_read(&mm->mm_users) <= 1) {
  		mm->owner = NULL;
  		return;
  	}
cf475ad28   Balbir Singh   cgroups: add an o...
408
409
410
411
412
413
414
415
416
417
418
419
420
  
  	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...
421
  	list_for_each_entry(c, &p->real_parent->children, sibling) {
cf475ad28   Balbir Singh   cgroups: add an o...
422
423
424
425
426
  		if (c->mm == mm)
  			goto assign_new_owner;
  	}
  
  	/*
f87fb599a   Oleg Nesterov   memcg: mm_update_...
427
  	 * Search through everything else, we should not get here often.
cf475ad28   Balbir Singh   cgroups: add an o...
428
  	 */
39af1765f   Oleg Nesterov   memcg: optimize t...
429
430
431
432
433
434
435
436
437
  	for_each_process(g) {
  		if (g->flags & PF_KTHREAD)
  			continue;
  		for_each_thread(g, c) {
  			if (c->mm == mm)
  				goto assign_new_owner;
  			if (c->mm)
  				break;
  		}
f87fb599a   Oleg Nesterov   memcg: mm_update_...
438
  	}
cf475ad28   Balbir Singh   cgroups: add an o...
439
  	read_unlock(&tasklist_lock);
31a78f23b   Balbir Singh   mm owner: fix rac...
440
441
442
  	/*
  	 * 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...
443
  	 * ptrace or page migration (get_task_mm()).  Mark owner as NULL.
31a78f23b   Balbir Singh   mm owner: fix rac...
444
  	 */
31a78f23b   Balbir Singh   mm owner: fix rac...
445
  	mm->owner = NULL;
cf475ad28   Balbir Singh   cgroups: add an o...
446
447
448
449
450
451
452
453
454
455
  	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...
456
457
458
459
460
  	/*
  	 * 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...
461
462
463
464
465
  	if (c->mm != mm) {
  		task_unlock(c);
  		put_task_struct(c);
  		goto retry;
  	}
cf475ad28   Balbir Singh   cgroups: add an o...
466
467
468
469
  	mm->owner = c;
  	task_unlock(c);
  	put_task_struct(c);
  }
f98bafa06   Oleg Nesterov   memcg: kill CONFI...
470
  #endif /* CONFIG_MEMCG */
cf475ad28   Balbir Singh   cgroups: add an o...
471

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
472
473
474
475
  /*
   * Turn us into a lazy TLB process if we
   * aren't already..
   */
0039962a1   Davidlohr Bueso   kernel/exit: Comp...
476
  static void exit_mm(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
  {
0039962a1   Davidlohr Bueso   kernel/exit: Comp...
478
  	struct mm_struct *mm = current->mm;
b564daf80   Oleg Nesterov   coredump: constru...
479
  	struct core_state *core_state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480

0039962a1   Davidlohr Bueso   kernel/exit: Comp...
481
  	mm_release(current, mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
483
  	if (!mm)
  		return;
4fe7efdbd   Konstantin Khlebnikov   mm: correctly syn...
484
  	sync_mm_rss(mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
485
486
  	/*
  	 * Serialize with any possible pending coredump.
999d9fc16   Oleg Nesterov   coredump: move mm...
487
  	 * We must hold mmap_sem around checking core_state
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
  	 * and clearing tsk->mm.  The core-inducing thread
999d9fc16   Oleg Nesterov   coredump: move mm...
489
  	 * will increment ->nr_threads for each thread in the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
491
492
  	 * group with ->mm != NULL.
  	 */
  	down_read(&mm->mmap_sem);
b564daf80   Oleg Nesterov   coredump: constru...
493
494
495
  	core_state = mm->core_state;
  	if (core_state) {
  		struct core_thread self;
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
496

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
497
  		up_read(&mm->mmap_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
498

0039962a1   Davidlohr Bueso   kernel/exit: Comp...
499
  		self.task = current;
b564daf80   Oleg Nesterov   coredump: constru...
500
501
502
503
504
505
506
  		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
507

a94e2d408   Oleg Nesterov   coredump: kill mm...
508
  		for (;;) {
642fa448a   Davidlohr Bueso   sched/core: Remov...
509
  			set_current_state(TASK_UNINTERRUPTIBLE);
a94e2d408   Oleg Nesterov   coredump: kill mm...
510
511
  			if (!self.task) /* see coredump_finish() */
  				break;
80d26af89   Mandeep Singh Baines   coredump: use a f...
512
  			freezable_schedule();
a94e2d408   Oleg Nesterov   coredump: kill mm...
513
  		}
642fa448a   Davidlohr Bueso   sched/core: Remov...
514
  		__set_current_state(TASK_RUNNING);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515
516
  		down_read(&mm->mmap_sem);
  	}
f1f100764   Vegard Nossum   mm: add new mmgra...
517
  	mmgrab(mm);
0039962a1   Davidlohr Bueso   kernel/exit: Comp...
518
  	BUG_ON(mm != current->active_mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
519
  	/* more a memory barrier than a real lock */
0039962a1   Davidlohr Bueso   kernel/exit: Comp...
520
521
  	task_lock(current);
  	current->mm = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
523
  	up_read(&mm->mmap_sem);
  	enter_lazy_tlb(mm, current);
0039962a1   Davidlohr Bueso   kernel/exit: Comp...
524
  	task_unlock(current);
cf475ad28   Balbir Singh   cgroups: add an o...
525
  	mm_update_next_owner(mm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
  	mmput(mm);
c32b3cbe0   Michal Hocko   oom, PM: make OOM...
527
  	if (test_thread_flag(TIF_MEMDIE))
38531201c   Tetsuo Handa   mm, oom: enforce ...
528
  		exit_oom_victim();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
  }
c9dc05bfd   Oleg Nesterov   exit: reparent: i...
530
531
532
533
534
535
536
537
538
539
  static struct task_struct *find_alive_thread(struct task_struct *p)
  {
  	struct task_struct *t;
  
  	for_each_thread(p, t) {
  		if (!(t->flags & PF_EXITING))
  			return t;
  	}
  	return NULL;
  }
1109909c7   Oleg Nesterov   exit: reparent: i...
540
541
542
543
544
545
546
547
548
  static struct task_struct *find_child_reaper(struct task_struct *father)
  	__releases(&tasklist_lock)
  	__acquires(&tasklist_lock)
  {
  	struct pid_namespace *pid_ns = task_active_pid_ns(father);
  	struct task_struct *reaper = pid_ns->child_reaper;
  
  	if (likely(reaper != father))
  		return reaper;
c9dc05bfd   Oleg Nesterov   exit: reparent: i...
549
550
  	reaper = find_alive_thread(father);
  	if (reaper) {
1109909c7   Oleg Nesterov   exit: reparent: i...
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
  		pid_ns->child_reaper = reaper;
  		return reaper;
  	}
  
  	write_unlock_irq(&tasklist_lock);
  	if (unlikely(pid_ns == &init_pid_ns)) {
  		panic("Attempted to kill init! exitcode=0x%08x
  ",
  			father->signal->group_exit_code ?: father->exit_code);
  	}
  	zap_pid_ns_processes(pid_ns);
  	write_lock_irq(&tasklist_lock);
  
  	return father;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
  /*
ebec18a6d   Lennart Poettering   prctl: add PR_{SE...
567
568
569
570
571
   * When we die, we re-parent all our children, and try to:
   * 1. give them to another thread in our thread group, if such a member exists
   * 2. give it to the first ancestor process which prctl'd itself as a
   *    child_subreaper for its children (like a service manager)
   * 3. give it to the init process (PID 1) in our pid namespace
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
572
   */
1109909c7   Oleg Nesterov   exit: reparent: i...
573
574
  static struct task_struct *find_new_reaper(struct task_struct *father,
  					   struct task_struct *child_reaper)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575
  {
c9dc05bfd   Oleg Nesterov   exit: reparent: i...
576
  	struct task_struct *thread, *reaper;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577

c9dc05bfd   Oleg Nesterov   exit: reparent: i...
578
579
  	thread = find_alive_thread(father);
  	if (thread)
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
580
  		return thread;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
581

7d24e2df5   Oleg Nesterov   exit: reparent: f...
582
  	if (father->signal->has_child_subreaper) {
c6c70f445   Oleg Nesterov   exit: fix the set...
583
  		unsigned int ns_level = task_pid(father)->level;
ebec18a6d   Lennart Poettering   prctl: add PR_{SE...
584
  		/*
175aed3f8   Oleg Nesterov   exit: reparent: d...
585
  		 * Find the first ->is_child_subreaper ancestor in our pid_ns.
c6c70f445   Oleg Nesterov   exit: fix the set...
586
587
588
589
590
  		 * We can't check reaper != child_reaper to ensure we do not
  		 * cross the namespaces, the exiting parent could be injected
  		 * by setns() + fork().
  		 * We check pid->level, this is slightly more efficient than
  		 * task_active_pid_ns(reaper) != task_active_pid_ns(father).
ebec18a6d   Lennart Poettering   prctl: add PR_{SE...
591
  		 */
c6c70f445   Oleg Nesterov   exit: fix the set...
592
593
  		for (reaper = father->real_parent;
  		     task_pid(reaper)->level == ns_level;
ebec18a6d   Lennart Poettering   prctl: add PR_{SE...
594
  		     reaper = reaper->real_parent) {
175aed3f8   Oleg Nesterov   exit: reparent: d...
595
  			if (reaper == &init_task)
ebec18a6d   Lennart Poettering   prctl: add PR_{SE...
596
597
598
  				break;
  			if (!reaper->signal->is_child_subreaper)
  				continue;
c9dc05bfd   Oleg Nesterov   exit: reparent: i...
599
600
601
  			thread = find_alive_thread(reaper);
  			if (thread)
  				return thread;
ebec18a6d   Lennart Poettering   prctl: add PR_{SE...
602
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
  	}
762a24bee   Oleg Nesterov   pid namespaces: r...
604

1109909c7   Oleg Nesterov   exit: reparent: i...
605
  	return child_reaper;
950bbabb5   Oleg Nesterov   pid_ns: (BUG 1139...
606
  }
5dfc80be7   Oleg Nesterov   forget_original_p...
607
608
609
  /*
  * Any that need to be release_task'd are put on the @dead list.
   */
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
610
  static void reparent_leader(struct task_struct *father, struct task_struct *p,
5dfc80be7   Oleg Nesterov   forget_original_p...
611
612
  				struct list_head *dead)
  {
2831096e2   Oleg Nesterov   exit: reparent: c...
613
  	if (unlikely(p->exit_state == EXIT_DEAD))
5dfc80be7   Oleg Nesterov   forget_original_p...
614
  		return;
abd50b39e   Oleg Nesterov   wait: introduce E...
615
  	/* We don't want people slaying init. */
5dfc80be7   Oleg Nesterov   forget_original_p...
616
617
618
  	p->exit_signal = SIGCHLD;
  
  	/* If it has exited notify the new parent about this child's death. */
d21142ece   Tejun Heo   ptrace: kill task...
619
  	if (!p->ptrace &&
5dfc80be7   Oleg Nesterov   forget_original_p...
620
  	    p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) {
867734737   Oleg Nesterov   make do_notify_pa...
621
  		if (do_notify_parent(p, p->exit_signal)) {
5dfc80be7   Oleg Nesterov   forget_original_p...
622
  			p->exit_state = EXIT_DEAD;
dc2fd4b00   Oleg Nesterov   exit: reparent: u...
623
  			list_add(&p->ptrace_entry, dead);
5dfc80be7   Oleg Nesterov   forget_original_p...
624
625
626
627
628
  		}
  	}
  
  	kill_orphaned_pgrp(p, father);
  }
482a3767e   Oleg Nesterov   exit: reparent: c...
629
630
631
632
633
634
635
636
637
638
  /*
   * 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)
   */
  static void forget_original_parent(struct task_struct *father,
  					struct list_head *dead)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
  {
482a3767e   Oleg Nesterov   exit: reparent: c...
640
  	struct task_struct *p, *t, *reaper;
762a24bee   Oleg Nesterov   pid namespaces: r...
641

7c8bd2322   Oleg Nesterov   exit: ptrace: shi...
642
  	if (unlikely(!list_empty(&father->ptraced)))
482a3767e   Oleg Nesterov   exit: reparent: c...
643
  		exit_ptrace(father, dead);
f470021ad   Roland McGrath   ptrace children r...
644

7c8bd2322   Oleg Nesterov   exit: ptrace: shi...
645
  	/* Can drop and reacquire tasklist_lock */
1109909c7   Oleg Nesterov   exit: reparent: i...
646
  	reaper = find_child_reaper(father);
ad9e206ae   Oleg Nesterov   exit: reparent: a...
647
  	if (list_empty(&father->children))
482a3767e   Oleg Nesterov   exit: reparent: c...
648
  		return;
1109909c7   Oleg Nesterov   exit: reparent: i...
649
650
  
  	reaper = find_new_reaper(father, reaper);
2831096e2   Oleg Nesterov   exit: reparent: c...
651
  	list_for_each_entry(p, &father->children, sibling) {
57a059187   Oleg Nesterov   exit: reparent: c...
652
  		for_each_thread(p, t) {
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
653
  			t->real_parent = reaper;
57a059187   Oleg Nesterov   exit: reparent: c...
654
655
  			BUG_ON((!t->ptrace) != (t->parent == father));
  			if (likely(!t->ptrace))
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
656
  				t->parent = t->real_parent;
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
657
658
659
  			if (t->pdeath_signal)
  				group_send_sig_info(t->pdeath_signal,
  						    SEND_SIG_NOINFO, t);
57a059187   Oleg Nesterov   exit: reparent: c...
660
  		}
2831096e2   Oleg Nesterov   exit: reparent: c...
661
662
663
664
665
  		/*
  		 * If this is a threaded reparent there is no need to
  		 * notify anyone anything has happened.
  		 */
  		if (!same_thread_group(reaper, father))
482a3767e   Oleg Nesterov   exit: reparent: c...
666
  			reparent_leader(father, p, dead);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
667
  	}
2831096e2   Oleg Nesterov   exit: reparent: c...
668
  	list_splice_tail_init(&father->children, &reaper->children);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669
670
671
672
673
674
  }
  
  /*
   * Send signals to all our closest relatives so that they know
   * to properly mourn us..
   */
821c7de71   Oleg Nesterov   exit_notify: fix ...
675
  static void exit_notify(struct task_struct *tsk, int group_dead)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676
  {
53c8f9f19   Oleg Nesterov   make do_notify_pa...
677
  	bool autoreap;
482a3767e   Oleg Nesterov   exit: reparent: c...
678
679
  	struct task_struct *p, *n;
  	LIST_HEAD(dead);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
680

762a24bee   Oleg Nesterov   pid namespaces: r...
681
  	write_lock_irq(&tasklist_lock);
482a3767e   Oleg Nesterov   exit: reparent: c...
682
  	forget_original_parent(tsk, &dead);
821c7de71   Oleg Nesterov   exit_notify: fix ...
683
684
  	if (group_dead)
  		kill_orphaned_pgrp(tsk->group_leader, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685

45cdf5cc0   Oleg Nesterov   kill tracehook_no...
686
687
688
689
690
691
692
693
694
695
696
697
  	if (unlikely(tsk->ptrace)) {
  		int sig = thread_group_leader(tsk) &&
  				thread_group_empty(tsk) &&
  				!ptrace_reparented(tsk) ?
  			tsk->exit_signal : SIGCHLD;
  		autoreap = do_notify_parent(tsk, sig);
  	} else if (thread_group_leader(tsk)) {
  		autoreap = thread_group_empty(tsk) &&
  			do_notify_parent(tsk, tsk->exit_signal);
  	} else {
  		autoreap = true;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698

53c8f9f19   Oleg Nesterov   make do_notify_pa...
699
  	tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE;
6c66e7dba   Oleg Nesterov   exit: exit_notify...
700
701
  	if (tsk->exit_state == EXIT_DEAD)
  		list_add(&tsk->ptrace_entry, &dead);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
702

9c3391684   Oleg Nesterov   exit: exit_notify...
703
704
  	/* mt-exec, de_thread() is waiting for group leader */
  	if (unlikely(tsk->signal->notify_count < 0))
6db840fa7   Oleg Nesterov   exec: RT sub-thre...
705
  		wake_up_process(tsk->signal->group_exit_task);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  	write_unlock_irq(&tasklist_lock);
482a3767e   Oleg Nesterov   exit: reparent: c...
707
708
709
710
  	list_for_each_entry_safe(p, n, &dead, ptrace_entry) {
  		list_del_init(&p->ptrace_entry);
  		release_task(p);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
  }
e18eecb8b   Jeff Dike   Add generic exit-...
712
713
714
715
716
  #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-...
717
  	unsigned long free;
7c9f8861e   Eric Sandeen   stackprotector: u...
718
  	free = stack_not_used(current);
e18eecb8b   Jeff Dike   Add generic exit-...
719
720
721
722
723
724
  
  	if (free >= lowest_to_date)
  		return;
  
  	spin_lock(&low_water_lock);
  	if (free < lowest_to_date) {
627393d44   Anton Blanchard   kernel/exit.c: qu...
725
726
  		pr_info("%s (%d) used greatest stack depth: %lu bytes left
  ",
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
727
  			current->comm, task_pid_nr(current), free);
e18eecb8b   Jeff Dike   Add generic exit-...
728
729
730
731
732
733
734
  		lowest_to_date = free;
  	}
  	spin_unlock(&low_water_lock);
  }
  #else
  static inline void check_stack_usage(void) {}
  #endif
9af6528ee   Peter Zijlstra   sched/core: Optim...
735
  void __noreturn do_exit(long code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
736
737
738
739
740
  {
  	struct task_struct *tsk = current;
  	int group_dead;
  
  	profile_task_exit(tsk);
5c9a8750a   Dmitry Vyukov   kernel: add kcov ...
741
  	kcov_task_exit(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
742

73c101011   Jens Axboe   block: initial pa...
743
  	WARN_ON(blk_needs_flush_plug(tsk));
22e2c507c   Jens Axboe   [PATCH] Update cf...
744

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
745
746
747
748
  	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
749

33dd94ae1   Nelson Elhage   do_exit(): make s...
750
751
752
753
754
755
756
757
  	/*
  	 * 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);
a288eecce   Tejun Heo   ptrace: kill triv...
758
  	ptrace_event(PTRACE_EVENT_EXIT, code);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759

e0e817392   David Howells   CRED: Add some co...
760
  	validate_creds_for_do_exit(tsk);
df164db5f   Alexander Nyberg   [PATCH] avoid res...
761
762
763
764
765
  	/*
  	 * 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)) {
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
766
767
  		pr_alert("Fixing recursive fault but reboot is needed!
  ");
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
768
769
770
771
772
773
774
775
776
777
  		/*
  		 * 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...
778
779
780
  		set_current_state(TASK_UNINTERRUPTIBLE);
  		schedule();
  	}
d12619b5f   Oleg Nesterov   fix group stop wi...
781
  	exit_signals(tsk);  /* sets PF_EXITING */
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
782
  	/*
be3e78449   Peter Zijlstra   locking/spinlock:...
783
784
  	 * Ensure that all new tsk->pi_lock acquisitions must observe
  	 * PF_EXITING. Serializes against futex.c:attach_to_pi_owner().
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
785
  	 */
d2ee7198c   Oleg Nesterov   pi-futex: set PF_...
786
  	smp_mb();
be3e78449   Peter Zijlstra   locking/spinlock:...
787
788
789
790
  	/*
  	 * Ensure that we must observe the pi_state in exit_mm() ->
  	 * mm_release() -> exit_pi_state_list().
  	 */
8083f2934   Paul E. McKenney   exit: Replace spi...
791
792
  	raw_spin_lock_irq(&tsk->pi_lock);
  	raw_spin_unlock_irq(&tsk->pi_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793

1dc0fffc4   Peter Zijlstra   sched/core: Robus...
794
  	if (unlikely(in_atomic())) {
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
795
796
797
798
  		pr_info("note: %s[%d] exited with preempt_count %d
  ",
  			current->comm, task_pid_nr(current),
  			preempt_count());
1dc0fffc4   Peter Zijlstra   sched/core: Robus...
799
800
  		preempt_count_set(PREEMPT_ENABLED);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801

48d212a2e   Linus Torvalds   Revert "mm: corre...
802
803
804
  	/* sync mm's RSS info before statistics gathering */
  	if (tsk->mm)
  		sync_mm_rss(tsk->mm);
51229b495   Rik van Riel   exit,stats: /* ob...
805
  	acct_update_integrals(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
  	group_dead = atomic_dec_and_test(&tsk->signal->live);
c30689516   Andrew Morton   [PATCH] revert "t...
807
  	if (group_dead) {
baa73d9e4   Nicolas Pitre   posix-timers: Mak...
808
  #ifdef CONFIG_POSIX_TIMERS
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
809
  		hrtimer_cancel(&tsk->signal->real_timer);
25f407f0b   Roland McGrath   [PATCH] Call exit...
810
  		exit_itimers(tsk->signal);
baa73d9e4   Nicolas Pitre   posix-timers: Mak...
811
  #endif
1f10206cf   Jiri Pirko   getrusage: fill r...
812
813
  		if (tsk->mm)
  			setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm);
c30689516   Andrew Morton   [PATCH] revert "t...
814
  	}
f6ec29a42   KaiGai Kohei   [PATCH] pacct: av...
815
  	acct_collect(code, group_dead);
522ed7767   Miloslav Trmac   Audit: add TTY in...
816
817
  	if (group_dead)
  		tty_audit_exit();
a4ff8dba7   Eric Paris   audit: inline aud...
818
  	audit_free(tsk);
115085ea0   Oleg Nesterov   [PATCH] taskstats...
819

48d212a2e   Linus Torvalds   Revert "mm: corre...
820
  	tsk->exit_code = code;
115085ea0   Oleg Nesterov   [PATCH] taskstats...
821
  	taskstats_exit(tsk, group_dead);
c757249af   Shailabh Nagar   [PATCH] per-task-...
822

0039962a1   Davidlohr Bueso   kernel/exit: Comp...
823
  	exit_mm();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824

0e4648141   KaiGai Kohei   [PATCH] pacct: ad...
825
  	if (group_dead)
f6ec29a42   KaiGai Kohei   [PATCH] pacct: av...
826
  		acct_process();
0a16b6075   Mathieu Desnoyers   tracing, sched: L...
827
  	trace_sched_process_exit(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828
  	exit_sem(tsk);
b34a6b1da   Vasiliy Kulikov   ipc: introduce sh...
829
  	exit_shm(tsk);
1ec7f1ddb   Al Viro   [PATCH] get rid o...
830
831
  	exit_files(tsk);
  	exit_fs(tsk);
c39df5fa3   Oleg Nesterov   exit: call disass...
832
833
  	if (group_dead)
  		disassociate_ctty(1);
8aac62706   Oleg Nesterov   move exit_task_na...
834
  	exit_task_namespaces(tsk);
ed3e694d7   Al Viro   move exit_task_wo...
835
  	exit_task_work(tsk);
e64646946   Jiri Slaby   exit_thread: acce...
836
  	exit_thread(tsk);
0b3fcf178   Stephane Eranian   perf_events: Move...
837
838
839
840
841
842
843
844
  
  	/*
  	 * 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);
8e5bfa8c1   Oleg Nesterov   sched/autogroup: ...
845
  	sched_autogroup_exit_task(tsk);
1ec41830e   Li Zefan   cgroup: remove us...
846
  	cgroup_exit(tsk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847

33b2fb303   Ingo Molnar   perf_counter: fix...
848
  	/*
24f1e32c6   Frederic Weisbecker   hw-breakpoints: R...
849
850
  	 * FIXME: do that only when needed, using sched_exit tracepoint
  	 */
7c8df2863   Oleg Nesterov   ptrace: revert "P...
851
  	flush_ptrace_hw_breakpoint(tsk);
33b2fb303   Ingo Molnar   perf_counter: fix...
852

ccdd29fff   Paul E. McKenney   rcu: Create reaso...
853
  	exit_tasks_rcu_start();
821c7de71   Oleg Nesterov   exit_notify: fix ...
854
  	exit_notify(tsk, group_dead);
ef9823939   Guillaume Morin   kernel/exit.c: ca...
855
  	proc_exit_connector(tsk);
c11600e4f   David Rientjes   mm, mempolicy: ta...
856
  	mpol_put_task_policy(tsk);
42b2dd0a0   Alexey Dobriyan   Shrink task_struc...
857
  #ifdef CONFIG_FUTEX
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
858
859
  	if (unlikely(current->pi_state_cache))
  		kfree(current->pi_state_cache);
42b2dd0a0   Alexey Dobriyan   Shrink task_struc...
860
  #endif
c87e2837b   Ingo Molnar   [PATCH] pi-futex:...
861
  	/*
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
862
  	 * Make sure we are holding no locks:
de5097c2e   Ingo Molnar   [PATCH] mutex sub...
863
  	 */
1b1d2fb44   Colin Cross   lockdep: remove t...
864
  	debug_check_no_locks_held();
778e9a9c3   Alexey Kuznetsov   pi-futex: fix exi...
865
866
867
868
869
870
  	/*
  	 * 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
871

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

b92ce5589   Jens Axboe   [PATCH] splice: a...
875
  	if (tsk->splice_pipe)
4b8a8f1e4   Al Viro   get rid of the la...
876
  		free_pipe_info(tsk->splice_pipe);
b92ce5589   Jens Axboe   [PATCH] splice: a...
877

5640f7685   Eric Dumazet   net: use a per ta...
878
879
  	if (tsk->task_frag.page)
  		put_page(tsk->task_frag.page);
e0e817392   David Howells   CRED: Add some co...
880
  	validate_creds_for_do_exit(tsk);
4bcb8232c   Oleg Nesterov   exit: move check_...
881
  	check_stack_usage();
7407251a0   Coywolf Qi Hunt   [PATCH] PF_DEAD c...
882
  	preempt_disable();
54848d73f   Wu Fengguang   writeback: charge...
883
884
  	if (tsk->nr_dirtied)
  		__this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied);
f41d911f8   Paul E. McKenney   rcu: Merge preemp...
885
  	exit_rcu();
ccdd29fff   Paul E. McKenney   rcu: Create reaso...
886
  	exit_tasks_rcu_finish();
b5740f4b2   Yasunori Goto   sched: Fix ancien...
887

b09be676e   Byungchul Park   locking/lockdep: ...
888
  	lockdep_free_task(tsk);
9af6528ee   Peter Zijlstra   sched/core: Optim...
889
  	do_task_dead();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
  }
012914dad   Russ Anderson   [patch] MCA recov...
891
  EXPORT_SYMBOL_GPL(do_exit);
9402c95f3   Joe Perches   treewide: remove ...
892
  void complete_and_exit(struct completion *comp, long code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893
894
895
  {
  	if (comp)
  		complete(comp);
55a101f8f   Oleg Nesterov   [PATCH] kill PF_D...
896

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
897
898
  	do_exit(code);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
899
  EXPORT_SYMBOL(complete_and_exit);
754fe8d29   Heiko Carstens   [CVE-2009-0029] S...
900
  SYSCALL_DEFINE1(exit, int, error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
901
902
903
  {
  	do_exit((error_code&0xff)<<8);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
904
905
906
907
  /*
   * Take down every thread in the group.  This is called by fatal signals
   * as well as by sys_exit_group (below).
   */
9402c95f3   Joe Perches   treewide: remove ...
908
  void
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
909
910
  do_group_exit(int exit_code)
  {
bfc4b0890   Oleg Nesterov   signals: do_group...
911
  	struct signal_struct *sig = current->signal;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912
  	BUG_ON(exit_code & 0x80); /* core dumps don't get here */
bfc4b0890   Oleg Nesterov   signals: do_group...
913
914
  	if (signal_group_exit(sig))
  		exit_code = sig->group_exit_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
915
  	else if (!thread_group_empty(current)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916
  		struct sighand_struct *const sighand = current->sighand;
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
917

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
  		spin_lock_irq(&sighand->siglock);
ed5d2cac1   Oleg Nesterov   exec: rework the ...
919
  		if (signal_group_exit(sig))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
921
922
  			/* Another thread got here before we took the lock.  */
  			exit_code = sig->group_exit_code;
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923
  			sig->group_exit_code = exit_code;
ed5d2cac1   Oleg Nesterov   exec: rework the ...
924
  			sig->flags = SIGNAL_GROUP_EXIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
926
927
  			zap_other_threads(current);
  		}
  		spin_unlock_irq(&sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
929
930
931
932
933
934
935
936
937
938
  	}
  
  	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...
939
  SYSCALL_DEFINE1(exit_group, int, error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
941
  {
  	do_group_exit((error_code & 0xff) << 8);
2ed7c03ec   Heiko Carstens   [CVE-2009-0029] C...
942
943
  	/* NOTREACHED */
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
944
  }
67d7ddded   Al Viro   waitid(2): leave ...
945
946
947
948
949
950
  struct waitid_info {
  	pid_t pid;
  	uid_t uid;
  	int status;
  	int cause;
  };
9e8ae01d1   Oleg Nesterov   introduce "struct...
951
952
  struct wait_opts {
  	enum pid_type		wo_type;
9e8ae01d1   Oleg Nesterov   introduce "struct...
953
  	int			wo_flags;
e1eb1ebcc   Richard Kennedy   mm: exit.c reorde...
954
  	struct pid		*wo_pid;
9e8ae01d1   Oleg Nesterov   introduce "struct...
955

67d7ddded   Al Viro   waitid(2): leave ...
956
  	struct waitid_info	*wo_info;
359566fae   Al Viro   kernel_wait4()/ke...
957
  	int			wo_stat;
ce72a16fa   Al Viro   wait4(2)/waitid(2...
958
  	struct rusage		*wo_rusage;
9e8ae01d1   Oleg Nesterov   introduce "struct...
959

ac6424b98   Ingo Molnar   sched/wait: Renam...
960
  	wait_queue_entry_t		child_wait;
9e8ae01d1   Oleg Nesterov   introduce "struct...
961
962
  	int			notask_error;
  };
989264f46   Oleg Nesterov   do_wait-wakeup-op...
963
964
  static inline
  struct pid *task_pid_type(struct task_struct *task, enum pid_type type)
161550d74   Eric W. Biederman   pid: sys_wait... ...
965
  {
989264f46   Oleg Nesterov   do_wait-wakeup-op...
966
967
968
  	if (type != PIDTYPE_PID)
  		task = task->group_leader;
  	return task->pids[type].pid;
161550d74   Eric W. Biederman   pid: sys_wait... ...
969
  }
989264f46   Oleg Nesterov   do_wait-wakeup-op...
970
  static int eligible_pid(struct wait_opts *wo, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
  {
5c01ba49e   Oleg Nesterov   do_wait-wakeup-op...
972
973
974
  	return	wo->wo_type == PIDTYPE_MAX ||
  		task_pid_type(p, wo->wo_type) == wo->wo_pid;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975

bf959931d   Oleg Nesterov   wait/ptrace: assu...
976
977
  static int
  eligible_child(struct wait_opts *wo, bool ptrace, struct task_struct *p)
5c01ba49e   Oleg Nesterov   do_wait-wakeup-op...
978
979
980
  {
  	if (!eligible_pid(wo, p))
  		return 0;
bf959931d   Oleg Nesterov   wait/ptrace: assu...
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
  
  	/*
  	 * Wait for all children (clone and not) if __WALL is set or
  	 * if it is traced by us.
  	 */
  	if (ptrace || (wo->wo_flags & __WALL))
  		return 1;
  
  	/*
  	 * 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, or a non-leader thread which
  	 * we can only see if it is traced by us.
  	 */
  	if ((p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
998
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999

14dd0b814   Roland McGrath   do_wait: return s...
1000
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
1004
1005
1006
1007
  /*
   * 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...
1008
  static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
  {
67d7ddded   Al Viro   waitid(2): leave ...
1010
  	int state, status;
6c5f3e7b4   Pavel Emelyanov   Pidns: make full ...
1011
  	pid_t pid = task_pid_vnr(p);
43e13cc10   Oleg Nesterov   cred: remove task...
1012
  	uid_t uid = from_kuid_munged(current_user_ns(), task_uid(p));
67d7ddded   Al Viro   waitid(2): leave ...
1013
  	struct waitid_info *infop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1014

9e8ae01d1   Oleg Nesterov   introduce "struct...
1015
  	if (!likely(wo->wo_flags & WEXITED))
98abed020   Roland McGrath   do_wait reorganiz...
1016
  		return 0;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1017
  	if (unlikely(wo->wo_flags & WNOWAIT)) {
76d9871e1   Al Viro   wait_task_zombie:...
1018
  		status = p->exit_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019
1020
  		get_task_struct(p);
  		read_unlock(&tasklist_lock);
1029a2b52   Peter Zijlstra   sched, exit: Deal...
1021
  		sched_annotate_sleep();
e61a25022   Al Viro   lift getrusage() ...
1022
1023
  		if (wo->wo_rusage)
  			getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
bb380ec33   Al Viro   kill wait_noreap_...
1024
  		put_task_struct(p);
76d9871e1   Al Viro   wait_task_zombie:...
1025
  		goto out_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1027
  	/*
abd50b39e   Oleg Nesterov   wait: introduce E...
1028
  	 * Move the task's state to DEAD/TRACE, only one thread can do this.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1029
  	 */
f6507f83b   Oleg Nesterov   exit: wait: clean...
1030
1031
  	state = (ptrace_reparented(p) && thread_group_leader(p)) ?
  		EXIT_TRACE : EXIT_DEAD;
abd50b39e   Oleg Nesterov   wait: introduce E...
1032
  	if (cmpxchg(&p->exit_state, EXIT_ZOMBIE, state) != EXIT_ZOMBIE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033
  		return 0;
986094dfe   Oleg Nesterov   exit: wait: drop ...
1034
1035
1036
1037
1038
  	/*
  	 * We own this thread, nobody else can reap it.
  	 */
  	read_unlock(&tasklist_lock);
  	sched_annotate_sleep();
f6507f83b   Oleg Nesterov   exit: wait: clean...
1039

befca9677   Oleg Nesterov   ptrace: wait_task...
1040
  	/*
f6507f83b   Oleg Nesterov   exit: wait: clean...
1041
  	 * Check thread_group_leader() to exclude the traced sub-threads.
befca9677   Oleg Nesterov   ptrace: wait_task...
1042
  	 */
f6507f83b   Oleg Nesterov   exit: wait: clean...
1043
  	if (state == EXIT_DEAD && thread_group_leader(p)) {
f953ccd00   Oleg Nesterov   exit: wait: don't...
1044
1045
  		struct signal_struct *sig = p->signal;
  		struct signal_struct *psig = current->signal;
1f10206cf   Jiri Pirko   getrusage: fill r...
1046
  		unsigned long maxrss;
5613fda9a   Frederic Weisbecker   sched/cputime: Co...
1047
  		u64 tgutime, tgstime;
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1048

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1049
1050
1051
1052
1053
1054
1055
1056
  		/*
  		 * 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
f953ccd00   Oleg Nesterov   exit: wait: don't...
1057
1058
1059
1060
1061
1062
1063
  		 * p->signal fields because the whole thread group is dead
  		 * and nobody can change them.
  		 *
  		 * psig->stats_lock also protects us from our sub-theads
  		 * which can reap other children at the same time. Until
  		 * we change k_getrusage()-like users to rely on this lock
  		 * we have to take ->siglock as well.
0cf55e1ec   Hidetoshi Seto   sched, cputime: I...
1064
  		 *
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
1065
1066
1067
  		 * We use thread_group_cputime_adjusted() 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
1068
  		 */
e80d0a1ae   Frederic Weisbecker   cputime: Rename t...
1069
  		thread_group_cputime_adjusted(p, &tgutime, &tgstime);
f953ccd00   Oleg Nesterov   exit: wait: don't...
1070
  		spin_lock_irq(&current->sighand->siglock);
e78c34967   Rik van Riel   time, signal: Pro...
1071
  		write_seqlock(&psig->stats_lock);
648616343   Martin Schwidefsky   [S390] cputime: a...
1072
1073
  		psig->cutime += tgutime + sig->cutime;
  		psig->cstime += tgstime + sig->cstime;
6fac4829c   Frederic Weisbecker   cputime: Use acce...
1074
  		psig->cgtime += task_gtime(p) + sig->gtime + sig->cgtime;
3795e1616   Jesper Juhl   [PATCH] Decrease ...
1075
1076
1077
1078
1079
1080
1081
1082
  		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...
1083
1084
1085
1086
1087
1088
  		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...
1089
1090
1091
  		maxrss = max(sig->maxrss, sig->cmaxrss);
  		if (psig->cmaxrss < maxrss)
  			psig->cmaxrss = maxrss;
5995477ab   Andrea Righi   task IO accountin...
1092
1093
  		task_io_accounting_add(&psig->ioac, &p->ioac);
  		task_io_accounting_add(&psig->ioac, &sig->ioac);
e78c34967   Rik van Riel   time, signal: Pro...
1094
  		write_sequnlock(&psig->stats_lock);
f953ccd00   Oleg Nesterov   exit: wait: don't...
1095
  		spin_unlock_irq(&current->sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1096
  	}
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1097
1098
  	if (wo->wo_rusage)
  		getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1099
1100
  	status = (p->signal->flags & SIGNAL_GROUP_EXIT)
  		? p->signal->group_exit_code : p->exit_code;
359566fae   Al Viro   kernel_wait4()/ke...
1101
  	wo->wo_stat = status;
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1102

b43606905   Oleg Nesterov   wait: use EXIT_TR...
1103
  	if (state == EXIT_TRACE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1104
  		write_lock_irq(&tasklist_lock);
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1105
1106
  		/* We dropped tasklist, ptracer could die and untrace */
  		ptrace_unlink(p);
b43606905   Oleg Nesterov   wait: use EXIT_TR...
1107
1108
1109
1110
1111
  
  		/* If parent wants a zombie, don't release it now */
  		state = EXIT_ZOMBIE;
  		if (do_notify_parent(p, p->exit_signal))
  			state = EXIT_DEAD;
abd50b39e   Oleg Nesterov   wait: introduce E...
1112
  		p->exit_state = state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113
1114
  		write_unlock_irq(&tasklist_lock);
  	}
abd50b39e   Oleg Nesterov   wait: introduce E...
1115
  	if (state == EXIT_DEAD)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1116
  		release_task(p);
2f4e6e2a8   Oleg Nesterov   wait_task_zombie:...
1117

76d9871e1   Al Viro   wait_task_zombie:...
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
  out_info:
  	infop = wo->wo_info;
  	if (infop) {
  		if ((status & 0x7f) == 0) {
  			infop->cause = CLD_EXITED;
  			infop->status = status >> 8;
  		} else {
  			infop->cause = (status & 0x80) ? CLD_DUMPED : CLD_KILLED;
  			infop->status = status & 0x7f;
  		}
  		infop->pid = pid;
  		infop->uid = uid;
  	}
67d7ddded   Al Viro   waitid(2): leave ...
1131
  	return pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1132
  }
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1133
1134
1135
  static int *task_stopped_code(struct task_struct *p, bool ptrace)
  {
  	if (ptrace) {
570ac9337   Oleg Nesterov   ptrace: task_stop...
1136
  		if (task_is_traced(p) && !(p->jobctl & JOBCTL_LISTENING))
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1137
1138
1139
1140
1141
1142
1143
  			return &p->exit_code;
  	} else {
  		if (p->signal->flags & SIGNAL_STOP_STOPPED)
  			return &p->signal->group_exit_code;
  	}
  	return NULL;
  }
19e274630   Tejun Heo   job control: reor...
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
  /**
   * wait_task_stopped - Wait for %TASK_STOPPED or %TASK_TRACED
   * @wo: wait options
   * @ptrace: is the wait for ptrace
   * @p: task to wait for
   *
   * Handle sys_wait4() work for %p in state %TASK_STOPPED or %TASK_TRACED.
   *
   * CONTEXT:
   * read_lock(&tasklist_lock), which is released if return value is
   * non-zero.  Also, grabs and releases @p->sighand->siglock.
   *
   * RETURNS:
   * 0 if wait condition didn't exist and search for other wait conditions
   * should continue.  Non-zero return, -errno on failure and @p's pid on
   * success, implies that tasklist_lock is released and wait condition
   * search should terminate.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161
   */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1162
1163
  static int wait_task_stopped(struct wait_opts *wo,
  				int ptrace, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1164
  {
67d7ddded   Al Viro   waitid(2): leave ...
1165
1166
  	struct waitid_info *infop;
  	int exit_code, *p_code, why;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1167
  	uid_t uid = 0; /* unneeded, required by compiler */
c89507835   Oleg Nesterov   wait_task_stopped...
1168
  	pid_t pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1169

47918025e   Oleg Nesterov   shift "ptrace imp...
1170
1171
1172
  	/*
  	 * Traditionally we see ptrace'd stopped tasks regardless of options.
  	 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1173
  	if (!ptrace && !(wo->wo_flags & WUNTRACED))
98abed020   Roland McGrath   do_wait reorganiz...
1174
  		return 0;
19e274630   Tejun Heo   job control: reor...
1175
1176
  	if (!task_stopped_code(p, ptrace))
  		return 0;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1177
1178
  	exit_code = 0;
  	spin_lock_irq(&p->sighand->siglock);
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1179
1180
  	p_code = task_stopped_code(p, ptrace);
  	if (unlikely(!p_code))
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1181
  		goto unlock_sig;
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1182
  	exit_code = *p_code;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1183
1184
  	if (!exit_code)
  		goto unlock_sig;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1185
  	if (!unlikely(wo->wo_flags & WNOWAIT))
90bc8d8b1   Oleg Nesterov   do_wait: fix wait...
1186
  		*p_code = 0;
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1187

8ca937a66   Sasha Levin   cred: use correct...
1188
  	uid = from_kuid_munged(current_user_ns(), task_uid(p));
ee7c82da8   Oleg Nesterov   wait_task_stopped...
1189
1190
1191
  unlock_sig:
  	spin_unlock_irq(&p->sighand->siglock);
  	if (!exit_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
  		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 ...
1202
  	pid = task_pid_vnr(p);
f470021ad   Roland McGrath   ptrace children r...
1203
  	why = ptrace ? CLD_TRAPPED : CLD_STOPPED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1204
  	read_unlock(&tasklist_lock);
1029a2b52   Peter Zijlstra   sched, exit: Deal...
1205
  	sched_annotate_sleep();
e61a25022   Al Viro   lift getrusage() ...
1206
1207
  	if (wo->wo_rusage)
  		getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
bb380ec33   Al Viro   kill wait_noreap_...
1208
  	put_task_struct(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1209

bb380ec33   Al Viro   kill wait_noreap_...
1210
1211
  	if (likely(!(wo->wo_flags & WNOWAIT)))
  		wo->wo_stat = (exit_code << 8) | 0x7f;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1212

9e8ae01d1   Oleg Nesterov   introduce "struct...
1213
  	infop = wo->wo_info;
67d7ddded   Al Viro   waitid(2): leave ...
1214
1215
1216
1217
1218
1219
  	if (infop) {
  		infop->cause = why;
  		infop->status = exit_code;
  		infop->pid = pid;
  		infop->uid = uid;
  	}
67d7ddded   Al Viro   waitid(2): leave ...
1220
  	return pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
1222
1223
1224
1225
1226
1227
1228
  }
  
  /*
   * 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...
1229
  static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1230
  {
bb380ec33   Al Viro   kill wait_noreap_...
1231
  	struct waitid_info *infop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1232
1233
  	pid_t pid;
  	uid_t uid;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1234
  	if (!unlikely(wo->wo_flags & WCONTINUED))
98abed020   Roland McGrath   do_wait reorganiz...
1235
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1236
1237
1238
1239
1240
1241
1242
1243
1244
  	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...
1245
  	if (!unlikely(wo->wo_flags & WNOWAIT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1246
  		p->signal->flags &= ~SIGNAL_STOP_CONTINUED;
8ca937a66   Sasha Levin   cred: use correct...
1247
  	uid = from_kuid_munged(current_user_ns(), task_uid(p));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1248
  	spin_unlock_irq(&p->sighand->siglock);
6c5f3e7b4   Pavel Emelyanov   Pidns: make full ...
1249
  	pid = task_pid_vnr(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250
1251
  	get_task_struct(p);
  	read_unlock(&tasklist_lock);
1029a2b52   Peter Zijlstra   sched, exit: Deal...
1252
  	sched_annotate_sleep();
e61a25022   Al Viro   lift getrusage() ...
1253
1254
  	if (wo->wo_rusage)
  		getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
bb380ec33   Al Viro   kill wait_noreap_...
1255
  	put_task_struct(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1256

bb380ec33   Al Viro   kill wait_noreap_...
1257
1258
  	infop = wo->wo_info;
  	if (!infop) {
359566fae   Al Viro   kernel_wait4()/ke...
1259
  		wo->wo_stat = 0xffff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1260
  	} else {
bb380ec33   Al Viro   kill wait_noreap_...
1261
1262
1263
1264
  		infop->cause = CLD_CONTINUED;
  		infop->pid = pid;
  		infop->uid = uid;
  		infop->status = SIGCONT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1265
  	}
bb380ec33   Al Viro   kill wait_noreap_...
1266
  	return pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1267
  }
98abed020   Roland McGrath   do_wait reorganiz...
1268
1269
1270
  /*
   * Consider @p for a wait by @parent.
   *
9e8ae01d1   Oleg Nesterov   introduce "struct...
1271
   * -ECHILD should be in ->notask_error before the first call.
98abed020   Roland McGrath   do_wait reorganiz...
1272
1273
   * 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...
1274
   * then ->notask_error is 0 if @p is an eligible child,
3a2f5a59a   Stephen Smalley   security,selinux,...
1275
   * or still -ECHILD.
98abed020   Roland McGrath   do_wait reorganiz...
1276
   */
b6e763f07   Oleg Nesterov   wait_consider_tas...
1277
1278
  static int wait_consider_task(struct wait_opts *wo, int ptrace,
  				struct task_struct *p)
98abed020   Roland McGrath   do_wait reorganiz...
1279
  {
3245d6aca   Oleg Nesterov   exit: fix race be...
1280
1281
1282
1283
1284
1285
  	/*
  	 * We can race with wait_task_zombie() from another thread.
  	 * Ensure that EXIT_ZOMBIE -> EXIT_DEAD/EXIT_TRACE transition
  	 * can't confuse the checks below.
  	 */
  	int exit_state = ACCESS_ONCE(p->exit_state);
b3ab03160   Oleg Nesterov   wait: completely ...
1286
  	int ret;
3245d6aca   Oleg Nesterov   exit: fix race be...
1287
  	if (unlikely(exit_state == EXIT_DEAD))
b3ab03160   Oleg Nesterov   wait: completely ...
1288
  		return 0;
bf959931d   Oleg Nesterov   wait/ptrace: assu...
1289
  	ret = eligible_child(wo, ptrace, p);
14dd0b814   Roland McGrath   do_wait: return s...
1290
  	if (!ret)
98abed020   Roland McGrath   do_wait reorganiz...
1291
  		return ret;
3245d6aca   Oleg Nesterov   exit: fix race be...
1292
  	if (unlikely(exit_state == EXIT_TRACE)) {
50b8d2574   Oleg Nesterov   ptrace: partially...
1293
  		/*
abd50b39e   Oleg Nesterov   wait: introduce E...
1294
1295
  		 * ptrace == 0 means we are the natural parent. In this case
  		 * we should clear notask_error, debugger will notify us.
50b8d2574   Oleg Nesterov   ptrace: partially...
1296
  		 */
abd50b39e   Oleg Nesterov   wait: introduce E...
1297
  		if (likely(!ptrace))
50b8d2574   Oleg Nesterov   ptrace: partially...
1298
  			wo->notask_error = 0;
823b018e5   Tejun Heo   job control: Smal...
1299
  		return 0;
50b8d2574   Oleg Nesterov   ptrace: partially...
1300
  	}
823b018e5   Tejun Heo   job control: Smal...
1301

377d75daf   Oleg Nesterov   wait: WSTOPPED|WC...
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
  	if (likely(!ptrace) && unlikely(p->ptrace)) {
  		/*
  		 * If it is traced by its real parent's group, just pretend
  		 * the caller is ptrace_do_wait() and reap this child if it
  		 * is zombie.
  		 *
  		 * This also hides group stop state from real parent; otherwise
  		 * a single stop can be reported twice as group and ptrace stop.
  		 * If a ptracer wants to distinguish these two events for its
  		 * own children it should create a separate process which takes
  		 * the role of real parent.
  		 */
  		if (!ptrace_reparented(p))
  			ptrace = 1;
  	}
45cb24a1d   Tejun Heo   job control: Allo...
1317
  	/* slay zombie? */
3245d6aca   Oleg Nesterov   exit: fix race be...
1318
  	if (exit_state == EXIT_ZOMBIE) {
9b84cca25   Tejun Heo   job control: Fix ...
1319
  		/* we don't reap group leaders with subthreads */
7c733eb3e   Oleg Nesterov   wait: WSTOPPED|WC...
1320
1321
1322
1323
1324
1325
1326
1327
1328
  		if (!delay_group_leader(p)) {
  			/*
  			 * A zombie ptracee is only visible to its ptracer.
  			 * Notification and reaping will be cascaded to the
  			 * real parent when the ptracer detaches.
  			 */
  			if (unlikely(ptrace) || likely(!p->ptrace))
  				return wait_task_zombie(wo, p);
  		}
98abed020   Roland McGrath   do_wait reorganiz...
1329

f470021ad   Roland McGrath   ptrace children r...
1330
  		/*
9b84cca25   Tejun Heo   job control: Fix ...
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
  		 * Allow access to stopped/continued state via zombie by
  		 * falling through.  Clearing of notask_error is complex.
  		 *
  		 * When !@ptrace:
  		 *
  		 * If WEXITED is set, notask_error should naturally be
  		 * cleared.  If not, subset of WSTOPPED|WCONTINUED is set,
  		 * so, if there are live subthreads, there are events to
  		 * wait for.  If all subthreads are dead, it's still safe
  		 * to clear - this function will be called again in finite
  		 * amount time once all the subthreads are released and
  		 * will then return without clearing.
  		 *
  		 * When @ptrace:
  		 *
  		 * Stopped state is per-task and thus can't change once the
  		 * target task dies.  Only continued and exited can happen.
  		 * Clear notask_error if WCONTINUED | WEXITED.
  		 */
  		if (likely(!ptrace) || (wo->wo_flags & (WCONTINUED | WEXITED)))
  			wo->notask_error = 0;
  	} else {
  		/*
  		 * @p is alive and it's gonna stop, continue or exit, so
  		 * there always is something to wait for.
f470021ad   Roland McGrath   ptrace children r...
1356
  		 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1357
  		wo->notask_error = 0;
f470021ad   Roland McGrath   ptrace children r...
1358
  	}
98abed020   Roland McGrath   do_wait reorganiz...
1359
  	/*
45cb24a1d   Tejun Heo   job control: Allo...
1360
1361
  	 * Wait for stopped.  Depending on @ptrace, different stopped state
  	 * is used and the two don't interact with each other.
98abed020   Roland McGrath   do_wait reorganiz...
1362
  	 */
19e274630   Tejun Heo   job control: reor...
1363
1364
1365
  	ret = wait_task_stopped(wo, ptrace, p);
  	if (ret)
  		return ret;
98abed020   Roland McGrath   do_wait reorganiz...
1366
1367
  
  	/*
45cb24a1d   Tejun Heo   job control: Allo...
1368
1369
1370
  	 * Wait for continued.  There's only one continued state and the
  	 * ptracer can consume it which can confuse the real parent.  Don't
  	 * use WCONTINUED from ptracer.  You don't need or want it.
98abed020   Roland McGrath   do_wait reorganiz...
1371
  	 */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1372
  	return wait_task_continued(wo, p);
98abed020   Roland McGrath   do_wait reorganiz...
1373
1374
1375
1376
1377
  }
  
  /*
   * Do the work of do_wait() for one thread in the group, @tsk.
   *
9e8ae01d1   Oleg Nesterov   introduce "struct...
1378
   * -ECHILD should be in ->notask_error before the first call.
98abed020   Roland McGrath   do_wait reorganiz...
1379
1380
   * 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...
1381
   * ->notask_error is 0 if there were any eligible children,
3a2f5a59a   Stephen Smalley   security,selinux,...
1382
   * or still -ECHILD.
98abed020   Roland McGrath   do_wait reorganiz...
1383
   */
9e8ae01d1   Oleg Nesterov   introduce "struct...
1384
  static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk)
98abed020   Roland McGrath   do_wait reorganiz...
1385
1386
1387
1388
  {
  	struct task_struct *p;
  
  	list_for_each_entry(p, &tsk->children, sibling) {
9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
1389
  		int ret = wait_consider_task(wo, 0, p);
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
1390

9cd80bbb0   Oleg Nesterov   do_wait() optimiz...
1391
1392
  		if (ret)
  			return ret;
98abed020   Roland McGrath   do_wait reorganiz...
1393
1394
1395
1396
  	}
  
  	return 0;
  }
9e8ae01d1   Oleg Nesterov   introduce "struct...
1397
  static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk)
98abed020   Roland McGrath   do_wait reorganiz...
1398
1399
  {
  	struct task_struct *p;
f470021ad   Roland McGrath   ptrace children r...
1400
  	list_for_each_entry(p, &tsk->ptraced, ptrace_entry) {
b6e763f07   Oleg Nesterov   wait_consider_tas...
1401
  		int ret = wait_consider_task(wo, 1, p);
a0be55dee   Ionut Alexa   kernel/exit.c: fi...
1402

f470021ad   Roland McGrath   ptrace children r...
1403
  		if (ret)
98abed020   Roland McGrath   do_wait reorganiz...
1404
  			return ret;
98abed020   Roland McGrath   do_wait reorganiz...
1405
1406
1407
1408
  	}
  
  	return 0;
  }
ac6424b98   Ingo Molnar   sched/wait: Renam...
1409
  static int child_wait_callback(wait_queue_entry_t *wait, unsigned mode,
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1410
1411
1412
1413
1414
  				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...
1415
  	if (!eligible_pid(wo, p))
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1416
  		return 0;
b4fe51823   Oleg Nesterov   do_wait() wakeup ...
1417
1418
  	if ((wo->wo_flags & __WNOTHREAD) && wait->private != p->parent)
  		return 0;
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1419
1420
  	return default_wake_function(wait, mode, sync, key);
  }
a7f0765ed   Oleg Nesterov   ptrace: __ptrace_...
1421
1422
  void __wake_up_parent(struct task_struct *p, struct task_struct *parent)
  {
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1423
1424
  	__wake_up_sync_key(&parent->signal->wait_chldexit,
  				TASK_INTERRUPTIBLE, 1, p);
a7f0765ed   Oleg Nesterov   ptrace: __ptrace_...
1425
  }
9e8ae01d1   Oleg Nesterov   introduce "struct...
1426
  static long do_wait(struct wait_opts *wo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1427
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1428
  	struct task_struct *tsk;
98abed020   Roland McGrath   do_wait reorganiz...
1429
  	int retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1430

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

0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1433
1434
1435
  	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
1436
  repeat:
98abed020   Roland McGrath   do_wait reorganiz...
1437
  	/*
3da56d166   Frans Klaver   kernel: exit: fix...
1438
  	 * If there is nothing that can match our criteria, just get out.
9e8ae01d1   Oleg Nesterov   introduce "struct...
1439
1440
1441
  	 * 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...
1442
  	 */
64a16caf5   Oleg Nesterov   do_wait: simplify...
1443
  	wo->notask_error = -ECHILD;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1444
1445
  	if ((wo->wo_type < PIDTYPE_MAX) &&
  	   (!wo->wo_pid || hlist_empty(&wo->wo_pid->tasks[wo->wo_type])))
64a16caf5   Oleg Nesterov   do_wait: simplify...
1446
  		goto notask;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1447

f95d39d10   Oleg Nesterov   do_wait: fix the ...
1448
  	set_current_state(TASK_INTERRUPTIBLE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1449
1450
1451
  	read_lock(&tasklist_lock);
  	tsk = current;
  	do {
64a16caf5   Oleg Nesterov   do_wait: simplify...
1452
1453
1454
  		retval = do_wait_thread(wo, tsk);
  		if (retval)
  			goto end;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1455

64a16caf5   Oleg Nesterov   do_wait: simplify...
1456
1457
  		retval = ptrace_do_wait(wo, tsk);
  		if (retval)
98abed020   Roland McGrath   do_wait reorganiz...
1458
  			goto end;
98abed020   Roland McGrath   do_wait reorganiz...
1459

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

64a16caf5   Oleg Nesterov   do_wait: simplify...
1465
  notask:
9e8ae01d1   Oleg Nesterov   introduce "struct...
1466
1467
  	retval = wo->notask_error;
  	if (!retval && !(wo->wo_flags & WNOHANG)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1468
  		retval = -ERESTARTSYS;
98abed020   Roland McGrath   do_wait reorganiz...
1469
1470
1471
1472
  		if (!signal_pending(current)) {
  			schedule();
  			goto repeat;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1474
  end:
f95d39d10   Oleg Nesterov   do_wait: fix the ...
1475
  	__set_current_state(TASK_RUNNING);
0b7570e77   Oleg Nesterov   do_wait() wakeup ...
1476
  	remove_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1477
1478
  	return retval;
  }
67d7ddded   Al Viro   waitid(2): leave ...
1479
  static long kernel_waitid(int which, pid_t upid, struct waitid_info *infop,
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1480
  			  int options, struct rusage *ru)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1481
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1482
  	struct wait_opts wo;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1483
1484
  	struct pid *pid = NULL;
  	enum pid_type type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1485
  	long ret;
91c4e8ea8   Oleg Nesterov   wait: allow sys_w...
1486
1487
  	if (options & ~(WNOHANG|WNOWAIT|WEXITED|WSTOPPED|WCONTINUED|
  			__WNOTHREAD|__WCLONE|__WALL))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1488
1489
1490
1491
1492
1493
  		return -EINVAL;
  	if (!(options & (WEXITED|WSTOPPED|WCONTINUED)))
  		return -EINVAL;
  
  	switch (which) {
  	case P_ALL:
161550d74   Eric W. Biederman   pid: sys_wait... ...
1494
  		type = PIDTYPE_MAX;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1495
1496
  		break;
  	case P_PID:
161550d74   Eric W. Biederman   pid: sys_wait... ...
1497
1498
  		type = PIDTYPE_PID;
  		if (upid <= 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1499
1500
1501
  			return -EINVAL;
  		break;
  	case P_PGID:
161550d74   Eric W. Biederman   pid: sys_wait... ...
1502
1503
  		type = PIDTYPE_PGID;
  		if (upid <= 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1504
  			return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1505
1506
1507
1508
  		break;
  	default:
  		return -EINVAL;
  	}
161550d74   Eric W. Biederman   pid: sys_wait... ...
1509
1510
  	if (type < PIDTYPE_MAX)
  		pid = find_get_pid(upid);
9e8ae01d1   Oleg Nesterov   introduce "struct...
1511
1512
1513
1514
1515
  
  	wo.wo_type	= type;
  	wo.wo_pid	= pid;
  	wo.wo_flags	= options;
  	wo.wo_info	= infop;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1516
1517
  	wo.wo_rusage	= ru;
  	ret = do_wait(&wo);
dfe16dfa4   Vitaly Mayatskikh   do_wait: fix sys_...
1518

161550d74   Eric W. Biederman   pid: sys_wait... ...
1519
  	put_pid(pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1520
1521
  	return ret;
  }
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1522
1523
1524
1525
  SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
  		infop, int, options, struct rusage __user *, ru)
  {
  	struct rusage r;
67d7ddded   Al Viro   waitid(2): leave ...
1526
1527
  	struct waitid_info info = {.status = 0};
  	long err = kernel_waitid(which, upid, &info, options, ru ? &r : NULL);
634a81609   Al Viro   fix waitid(2) bre...
1528
  	int signo = 0;
6c85501f2   Al Viro   fix infoleak in w...
1529

634a81609   Al Viro   fix waitid(2) bre...
1530
1531
1532
  	if (err > 0) {
  		signo = SIGCHLD;
  		err = 0;
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1533
1534
1535
  		if (ru && copy_to_user(ru, &r, sizeof(struct rusage)))
  			return -EFAULT;
  	}
67d7ddded   Al Viro   waitid(2): leave ...
1536
1537
  	if (!infop)
  		return err;
96ca579a1   Kees Cook   waitid(): Add mis...
1538
  	if (!access_ok(VERIFY_WRITE, infop, sizeof(*infop)))
1c9fec470   Kees Cook   waitid(): Avoid u...
1539
  		return -EFAULT;
96ca579a1   Kees Cook   waitid(): Add mis...
1540

4c48abe91   Al Viro   waitid(): switch ...
1541
  	user_access_begin();
634a81609   Al Viro   fix waitid(2) bre...
1542
  	unsafe_put_user(signo, &infop->si_signo, Efault);
4c48abe91   Al Viro   waitid(): switch ...
1543
  	unsafe_put_user(0, &infop->si_errno, Efault);
cc731525f   Eric W. Biederman   signal: Remove ke...
1544
  	unsafe_put_user(info.cause, &infop->si_code, Efault);
4c48abe91   Al Viro   waitid(): switch ...
1545
1546
1547
1548
  	unsafe_put_user(info.pid, &infop->si_pid, Efault);
  	unsafe_put_user(info.uid, &infop->si_uid, Efault);
  	unsafe_put_user(info.status, &infop->si_status, Efault);
  	user_access_end();
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1549
  	return err;
4c48abe91   Al Viro   waitid(): switch ...
1550
1551
1552
  Efault:
  	user_access_end();
  	return -EFAULT;
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1553
  }
92ebce5ac   Al Viro   osf_wait4: switch...
1554
1555
  long kernel_wait4(pid_t upid, int __user *stat_addr, int options,
  		  struct rusage *ru)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1556
  {
9e8ae01d1   Oleg Nesterov   introduce "struct...
1557
  	struct wait_opts wo;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1558
1559
  	struct pid *pid = NULL;
  	enum pid_type type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1560
1561
1562
1563
1564
  	long ret;
  
  	if (options & ~(WNOHANG|WUNTRACED|WCONTINUED|
  			__WNOTHREAD|__WCLONE|__WALL))
  		return -EINVAL;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1565

dd83c161f   zhongjiang   kernel/exit.c: av...
1566
1567
1568
  	/* -INT_MIN is not defined */
  	if (upid == INT_MIN)
  		return -ESRCH;
161550d74   Eric W. Biederman   pid: sys_wait... ...
1569
1570
1571
1572
1573
1574
1575
  	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...
1576
  		pid = get_task_pid(current, PIDTYPE_PGID);
161550d74   Eric W. Biederman   pid: sys_wait... ...
1577
1578
1579
1580
  	} else /* upid > 0 */ {
  		type = PIDTYPE_PID;
  		pid = find_get_pid(upid);
  	}
9e8ae01d1   Oleg Nesterov   introduce "struct...
1581
1582
1583
1584
  	wo.wo_type	= type;
  	wo.wo_pid	= pid;
  	wo.wo_flags	= options | WEXITED;
  	wo.wo_info	= NULL;
359566fae   Al Viro   kernel_wait4()/ke...
1585
  	wo.wo_stat	= 0;
9e8ae01d1   Oleg Nesterov   introduce "struct...
1586
1587
  	wo.wo_rusage	= ru;
  	ret = do_wait(&wo);
161550d74   Eric W. Biederman   pid: sys_wait... ...
1588
  	put_pid(pid);
359566fae   Al Viro   kernel_wait4()/ke...
1589
1590
  	if (ret > 0 && stat_addr && put_user(wo.wo_stat, stat_addr))
  		ret = -EFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1591

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1592
1593
  	return ret;
  }
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
  SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
  		int, options, struct rusage __user *, ru)
  {
  	struct rusage r;
  	long err = kernel_wait4(upid, stat_addr, options, ru ? &r : NULL);
  
  	if (err > 0) {
  		if (ru && copy_to_user(ru, &r, sizeof(struct rusage)))
  			return -EFAULT;
  	}
  	return err;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1606
1607
1608
1609
1610
1611
  #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...
1612
  SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1613
1614
1615
1616
1617
  {
  	return sys_wait4(pid, stat_addr, options, NULL);
  }
  
  #endif
7e95a2259   Al Viro   move compat wait4...
1618
1619
1620
1621
1622
1623
1624
1625
  
  #ifdef CONFIG_COMPAT
  COMPAT_SYSCALL_DEFINE4(wait4,
  	compat_pid_t, pid,
  	compat_uint_t __user *, stat_addr,
  	int, options,
  	struct compat_rusage __user *, ru)
  {
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1626
1627
1628
1629
1630
  	struct rusage r;
  	long err = kernel_wait4(pid, stat_addr, options, ru ? &r : NULL);
  	if (err > 0) {
  		if (ru && put_compat_rusage(&r, ru))
  			return -EFAULT;
7e95a2259   Al Viro   move compat wait4...
1631
  	}
ce72a16fa   Al Viro   wait4(2)/waitid(2...
1632
  	return err;
7e95a2259   Al Viro   move compat wait4...
1633
1634
1635
1636
1637
1638
1639
  }
  
  COMPAT_SYSCALL_DEFINE5(waitid,
  		int, which, compat_pid_t, pid,
  		struct compat_siginfo __user *, infop, int, options,
  		struct compat_rusage __user *, uru)
  {
7e95a2259   Al Viro   move compat wait4...
1640
  	struct rusage ru;
67d7ddded   Al Viro   waitid(2): leave ...
1641
1642
  	struct waitid_info info = {.status = 0};
  	long err = kernel_waitid(which, pid, &info, options, uru ? &ru : NULL);
634a81609   Al Viro   fix waitid(2) bre...
1643
1644
1645
1646
  	int signo = 0;
  	if (err > 0) {
  		signo = SIGCHLD;
  		err = 0;
6c85501f2   Al Viro   fix infoleak in w...
1647
1648
1649
1650
1651
1652
1653
1654
1655
  		if (uru) {
  			/* kernel_waitid() overwrites everything in ru */
  			if (COMPAT_USE_64BIT_TIME)
  				err = copy_to_user(uru, &ru, sizeof(ru));
  			else
  				err = put_compat_rusage(&ru, uru);
  			if (err)
  				return -EFAULT;
  		}
7e95a2259   Al Viro   move compat wait4...
1656
  	}
4c48abe91   Al Viro   waitid(): switch ...
1657
1658
  	if (!infop)
  		return err;
96ca579a1   Kees Cook   waitid(): Add mis...
1659
  	if (!access_ok(VERIFY_WRITE, infop, sizeof(*infop)))
1c9fec470   Kees Cook   waitid(): Avoid u...
1660
  		return -EFAULT;
96ca579a1   Kees Cook   waitid(): Add mis...
1661

4c48abe91   Al Viro   waitid(): switch ...
1662
  	user_access_begin();
634a81609   Al Viro   fix waitid(2) bre...
1663
  	unsafe_put_user(signo, &infop->si_signo, Efault);
4c48abe91   Al Viro   waitid(): switch ...
1664
  	unsafe_put_user(0, &infop->si_errno, Efault);
cc731525f   Eric W. Biederman   signal: Remove ke...
1665
  	unsafe_put_user(info.cause, &infop->si_code, Efault);
4c48abe91   Al Viro   waitid(): switch ...
1666
1667
1668
1669
  	unsafe_put_user(info.pid, &infop->si_pid, Efault);
  	unsafe_put_user(info.uid, &infop->si_uid, Efault);
  	unsafe_put_user(info.status, &infop->si_status, Efault);
  	user_access_end();
67d7ddded   Al Viro   waitid(2): leave ...
1670
  	return err;
4c48abe91   Al Viro   waitid(): switch ...
1671
1672
1673
  Efault:
  	user_access_end();
  	return -EFAULT;
7e95a2259   Al Viro   move compat wait4...
1674
1675
  }
  #endif
c5c91d830   Sudip Mukherjee   arch: define weak...
1676
1677
1678
1679
1680
1681
1682
1683
  
  __weak void abort(void)
  {
  	BUG();
  
  	/* if that doesn't kill us, halt */
  	panic("Oops failed to kill thread");
  }
f18046f7a   Andrew Morton   kernel/exit.c: ex...
1684
  EXPORT_SYMBOL(abort);