Blame view

kernel/posix-cpu-timers.c 42.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  /*
   * Implement CPU time clocks for the POSIX clock interface.
   */
  
  #include <linux/sched.h>
  #include <linux/posix-timers.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <linux/errno.h>
f8bd2258e   Roman Zippel   remove div_long_l...
8
9
  #include <linux/math64.h>
  #include <asm/uaccess.h>
bb34d92f6   Frank Mayhar   timers: fix itime...
10
  #include <linux/kernel_stat.h>
3f0a525eb   Xiao Guangrong   itimers: Add trac...
11
  #include <trace/events/timer.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12

f06febc96   Frank Mayhar   timers: fix itime...
13
  /*
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
14
15
16
17
   * Called after updating RLIMIT_CPU to run cpu timer and update
   * tsk->signal->cputime_expires expiration cache if necessary. Needs
   * siglock protection since other code may update expiration cache as
   * well.
f06febc96   Frank Mayhar   timers: fix itime...
18
   */
5ab46b345   Jiri Slaby   rlimits: add task...
19
  void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new)
f06febc96   Frank Mayhar   timers: fix itime...
20
  {
42c4ab41a   Stanislaw Gruszka   itimers: Merge IT...
21
  	cputime_t cputime = secs_to_cputime(rlim_new);
f06febc96   Frank Mayhar   timers: fix itime...
22

5ab46b345   Jiri Slaby   rlimits: add task...
23
24
25
  	spin_lock_irq(&task->sighand->siglock);
  	set_process_cpu_timer(task, CPUCLOCK_PROF, &cputime, NULL);
  	spin_unlock_irq(&task->sighand->siglock);
f06febc96   Frank Mayhar   timers: fix itime...
26
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
27
  static int check_clock(const clockid_t which_clock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
31
32
33
34
35
36
37
  {
  	int error = 0;
  	struct task_struct *p;
  	const pid_t pid = CPUCLOCK_PID(which_clock);
  
  	if (CPUCLOCK_WHICH(which_clock) >= CPUCLOCK_MAX)
  		return -EINVAL;
  
  	if (pid == 0)
  		return 0;
c0deae8c9   Sergey Senozhatsky   posix-cpu-timers:...
38
  	rcu_read_lock();
8dc86af00   Pavel Emelyanov   Use find_task_by_...
39
  	p = find_task_by_vpid(pid);
bac0abd61   Pavel Emelyanov   Isolate some expl...
40
  	if (!p || !(CPUCLOCK_PERTHREAD(which_clock) ?
c0deae8c9   Sergey Senozhatsky   posix-cpu-timers:...
41
  		   same_thread_group(p, current) : has_group_leader_pid(p))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
  		error = -EINVAL;
  	}
c0deae8c9   Sergey Senozhatsky   posix-cpu-timers:...
44
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
49
  
  	return error;
  }
  
  static inline union cpu_time_count
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
50
  timespec_to_sample(const clockid_t which_clock, const struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
54
  {
  	union cpu_time_count ret;
  	ret.sched = 0;		/* high half always zero when .cpu used */
  	if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
ee500f274   Oleg Nesterov   [PATCH] fix 32bit...
55
  		ret.sched = (unsigned long long)tp->tv_sec * NSEC_PER_SEC + tp->tv_nsec;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
59
60
  	} else {
  		ret.cpu = timespec_to_cputime(tp);
  	}
  	return ret;
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
61
  static void sample_to_timespec(const clockid_t which_clock,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
  			       union cpu_time_count cpu,
  			       struct timespec *tp)
  {
f8bd2258e   Roman Zippel   remove div_long_l...
65
66
67
  	if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED)
  		*tp = ns_to_timespec(cpu.sched);
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  		cputime_to_timespec(cpu.cpu, tp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
70
  static inline int cpu_time_before(const clockid_t which_clock,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
75
76
77
78
79
  				  union cpu_time_count now,
  				  union cpu_time_count then)
  {
  	if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
  		return now.sched < then.sched;
  	}  else {
  		return cputime_lt(now.cpu, then.cpu);
  	}
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
80
  static inline void cpu_time_add(const clockid_t which_clock,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
86
87
88
89
  				union cpu_time_count *acc,
  			        union cpu_time_count val)
  {
  	if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
  		acc->sched += val.sched;
  	}  else {
  		acc->cpu = cputime_add(acc->cpu, val.cpu);
  	}
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
90
  static inline union cpu_time_count cpu_time_sub(const clockid_t which_clock,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
94
95
96
97
98
99
100
101
102
  						union cpu_time_count a,
  						union cpu_time_count b)
  {
  	if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
  		a.sched -= b.sched;
  	}  else {
  		a.cpu = cputime_sub(a.cpu, b.cpu);
  	}
  	return a;
  }
  
  /*
ac08c2649   Thomas Gleixner   [PATCH] posix-cpu...
103
104
105
106
107
108
109
110
111
112
113
114
115
   * Divide and limit the result to res >= 1
   *
   * This is necessary to prevent signal delivery starvation, when the result of
   * the division would be rounded down to 0.
   */
  static inline cputime_t cputime_div_non_zero(cputime_t time, unsigned long div)
  {
  	cputime_t res = cputime_div(time, div);
  
  	return max_t(cputime_t, res, 1);
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
117
118
   * Update expiry time from increment, and increase overrun count,
   * given the current clock sample.
   */
7a4ed937a   Oleg Nesterov   [PATCH] Fix cpu t...
119
  static void bump_cpu_timer(struct k_itimer *timer,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  				  union cpu_time_count now)
  {
  	int i;
  
  	if (timer->it.cpu.incr.sched == 0)
  		return;
  
  	if (CPUCLOCK_WHICH(timer->it_clock) == CPUCLOCK_SCHED) {
  		unsigned long long delta, incr;
  
  		if (now.sched < timer->it.cpu.expires.sched)
  			return;
  		incr = timer->it.cpu.incr.sched;
  		delta = now.sched + incr - timer->it.cpu.expires.sched;
  		/* Don't use (incr*2 < delta), incr*2 might overflow. */
  		for (i = 0; incr < delta - incr; i++)
  			incr = incr << 1;
  		for (; i >= 0; incr >>= 1, i--) {
7a4ed937a   Oleg Nesterov   [PATCH] Fix cpu t...
138
  			if (delta < incr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  				continue;
  			timer->it.cpu.expires.sched += incr;
  			timer->it_overrun += 1 << i;
  			delta -= incr;
  		}
  	} else {
  		cputime_t delta, incr;
  
  		if (cputime_lt(now.cpu, timer->it.cpu.expires.cpu))
  			return;
  		incr = timer->it.cpu.incr.cpu;
  		delta = cputime_sub(cputime_add(now.cpu, incr),
  				    timer->it.cpu.expires.cpu);
  		/* Don't use (incr*2 < delta), incr*2 might overflow. */
  		for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++)
  			     incr = cputime_add(incr, incr);
  		for (; i >= 0; incr = cputime_halve(incr), i--) {
7a4ed937a   Oleg Nesterov   [PATCH] Fix cpu t...
156
  			if (cputime_lt(delta, incr))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
  				continue;
  			timer->it.cpu.expires.cpu =
  				cputime_add(timer->it.cpu.expires.cpu, incr);
  			timer->it_overrun += 1 << i;
  			delta = cputime_sub(delta, incr);
  		}
  	}
  }
  
  static inline cputime_t prof_ticks(struct task_struct *p)
  {
  	return cputime_add(p->utime, p->stime);
  }
  static inline cputime_t virt_ticks(struct task_struct *p)
  {
  	return p->utime;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174

bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
175
176
  static int
  posix_cpu_clock_getres(const clockid_t which_clock, struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  {
  	int error = check_clock(which_clock);
  	if (!error) {
  		tp->tv_sec = 0;
  		tp->tv_nsec = ((NSEC_PER_SEC + HZ - 1) / HZ);
  		if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) {
  			/*
  			 * If sched_clock is using a cycle counter, we
  			 * don't have any idea of its true resolution
  			 * exported, but it is much more than 1s/HZ.
  			 */
  			tp->tv_nsec = 1;
  		}
  	}
  	return error;
  }
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
193
194
  static int
  posix_cpu_clock_set(const clockid_t which_clock, const struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  {
  	/*
  	 * You can never reset a CPU clock, but we check for other errors
  	 * in the call before failing with EPERM.
  	 */
  	int error = check_clock(which_clock);
  	if (error == 0) {
  		error = -EPERM;
  	}
  	return error;
  }
  
  
  /*
   * Sample a per-thread clock for the given task.
   */
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
211
  static int cpu_clock_sample(const clockid_t which_clock, struct task_struct *p,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
214
215
216
217
218
219
220
221
222
223
  			    union cpu_time_count *cpu)
  {
  	switch (CPUCLOCK_WHICH(which_clock)) {
  	default:
  		return -EINVAL;
  	case CPUCLOCK_PROF:
  		cpu->cpu = prof_ticks(p);
  		break;
  	case CPUCLOCK_VIRT:
  		cpu->cpu = virt_ticks(p);
  		break;
  	case CPUCLOCK_SCHED:
c5f8d9958   Hidetoshi Seto   posixtimers, sche...
224
  		cpu->sched = task_sched_runtime(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
226
227
228
  		break;
  	}
  	return 0;
  }
4cd4c1b40   Peter Zijlstra   timers: split pro...
229
230
  void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
  {
bfac70091   Oleg Nesterov   sched: thread_gro...
231
  	struct signal_struct *sig = tsk->signal;
4cd4c1b40   Peter Zijlstra   timers: split pro...
232
  	struct task_struct *t;
bfac70091   Oleg Nesterov   sched: thread_gro...
233
234
235
  	times->utime = sig->utime;
  	times->stime = sig->stime;
  	times->sum_exec_runtime = sig->sum_sched_runtime;
4cd4c1b40   Peter Zijlstra   timers: split pro...
236
237
  
  	rcu_read_lock();
bfac70091   Oleg Nesterov   sched: thread_gro...
238
239
  	/* make sure we can trust tsk->thread_group list */
  	if (!likely(pid_alive(tsk)))
4cd4c1b40   Peter Zijlstra   timers: split pro...
240
  		goto out;
4cd4c1b40   Peter Zijlstra   timers: split pro...
241
242
243
244
245
  	t = tsk;
  	do {
  		times->utime = cputime_add(times->utime, t->utime);
  		times->stime = cputime_add(times->stime, t->stime);
  		times->sum_exec_runtime += t->se.sum_exec_runtime;
bfac70091   Oleg Nesterov   sched: thread_gro...
246
  	} while_each_thread(tsk, t);
4cd4c1b40   Peter Zijlstra   timers: split pro...
247
248
249
  out:
  	rcu_read_unlock();
  }
4da94d49b   Peter Zijlstra   timers: fix TIMER...
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
280
281
282
  static void update_gt_cputime(struct task_cputime *a, struct task_cputime *b)
  {
  	if (cputime_gt(b->utime, a->utime))
  		a->utime = b->utime;
  
  	if (cputime_gt(b->stime, a->stime))
  		a->stime = b->stime;
  
  	if (b->sum_exec_runtime > a->sum_exec_runtime)
  		a->sum_exec_runtime = b->sum_exec_runtime;
  }
  
  void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)
  {
  	struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
  	struct task_cputime sum;
  	unsigned long flags;
  
  	spin_lock_irqsave(&cputimer->lock, flags);
  	if (!cputimer->running) {
  		cputimer->running = 1;
  		/*
  		 * The POSIX timer interface allows for absolute time expiry
  		 * values through the TIMER_ABSTIME flag, therefore we have
  		 * to synchronize the timer to the clock every time we start
  		 * it.
  		 */
  		thread_group_cputime(tsk, &sum);
  		update_gt_cputime(&cputimer->cputime, &sum);
  	}
  	*times = cputimer->cputime;
  	spin_unlock_irqrestore(&cputimer->lock, flags);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
285
  /*
   * Sample a process (thread group) clock for the given group_leader task.
   * Must be called with tasklist_lock held for reading.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
   */
bb34d92f6   Frank Mayhar   timers: fix itime...
287
288
289
  static int cpu_clock_sample_group(const clockid_t which_clock,
  				  struct task_struct *p,
  				  union cpu_time_count *cpu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
  {
f06febc96   Frank Mayhar   timers: fix itime...
291
  	struct task_cputime cputime;
eccdaeafa   Petr Tesarik   posix-cpu-timers:...
292
  	switch (CPUCLOCK_WHICH(which_clock)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
  	default:
  		return -EINVAL;
  	case CPUCLOCK_PROF:
c5f8d9958   Hidetoshi Seto   posixtimers, sche...
296
  		thread_group_cputime(p, &cputime);
f06febc96   Frank Mayhar   timers: fix itime...
297
  		cpu->cpu = cputime_add(cputime.utime, cputime.stime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
  		break;
  	case CPUCLOCK_VIRT:
c5f8d9958   Hidetoshi Seto   posixtimers, sche...
300
  		thread_group_cputime(p, &cputime);
f06febc96   Frank Mayhar   timers: fix itime...
301
  		cpu->cpu = cputime.utime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
303
  		break;
  	case CPUCLOCK_SCHED:
c5f8d9958   Hidetoshi Seto   posixtimers, sche...
304
  		cpu->sched = thread_group_sched_runtime(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
307
308
  		break;
  	}
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309

bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
310
  static int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
  {
  	const pid_t pid = CPUCLOCK_PID(which_clock);
  	int error = -EINVAL;
  	union cpu_time_count rtn;
  
  	if (pid == 0) {
  		/*
  		 * Special case constant value for our own clocks.
  		 * We don't have to do any lookup to find ourselves.
  		 */
  		if (CPUCLOCK_PERTHREAD(which_clock)) {
  			/*
  			 * Sampling just ourselves we can do with no locking.
  			 */
  			error = cpu_clock_sample(which_clock,
  						 current, &rtn);
  		} else {
  			read_lock(&tasklist_lock);
  			error = cpu_clock_sample_group(which_clock,
  						       current, &rtn);
  			read_unlock(&tasklist_lock);
  		}
  	} else {
  		/*
  		 * Find the given PID, and validate that the caller
  		 * should be able to see it.
  		 */
  		struct task_struct *p;
1f2ea0837   Paul E. McKenney   [PATCH] posix tim...
339
  		rcu_read_lock();
8dc86af00   Pavel Emelyanov   Use find_task_by_...
340
  		p = find_task_by_vpid(pid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
  		if (p) {
  			if (CPUCLOCK_PERTHREAD(which_clock)) {
bac0abd61   Pavel Emelyanov   Isolate some expl...
343
  				if (same_thread_group(p, current)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
345
346
  					error = cpu_clock_sample(which_clock,
  								 p, &rtn);
  				}
1f2ea0837   Paul E. McKenney   [PATCH] posix tim...
347
348
  			} else {
  				read_lock(&tasklist_lock);
d30fda355   Oleg Nesterov   posix-cpu-timers:...
349
  				if (thread_group_leader(p) && p->sighand) {
1f2ea0837   Paul E. McKenney   [PATCH] posix tim...
350
351
352
353
354
  					error =
  					    cpu_clock_sample_group(which_clock,
  							           p, &rtn);
  				}
  				read_unlock(&tasklist_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
356
  			}
  		}
1f2ea0837   Paul E. McKenney   [PATCH] posix tim...
357
  		rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
358
359
360
361
362
363
364
365
366
367
368
  	}
  
  	if (error)
  		return error;
  	sample_to_timespec(which_clock, rtn, tp);
  	return 0;
  }
  
  
  /*
   * Validate the clockid_t for a new CPU-clock timer, and initialize the timer.
ba5ea951d   Stanislaw Gruszka   posix-cpu-timers:...
369
370
   * This is called from sys_timer_create() and do_cpu_nanosleep() with the
   * new timer already all-zeros initialized.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
   */
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
372
  static int posix_cpu_timer_create(struct k_itimer *new_timer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
374
375
376
377
378
379
380
381
  {
  	int ret = 0;
  	const pid_t pid = CPUCLOCK_PID(new_timer->it_clock);
  	struct task_struct *p;
  
  	if (CPUCLOCK_WHICH(new_timer->it_clock) >= CPUCLOCK_MAX)
  		return -EINVAL;
  
  	INIT_LIST_HEAD(&new_timer->it.cpu.entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382

c0deae8c9   Sergey Senozhatsky   posix-cpu-timers:...
383
  	rcu_read_lock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
385
386
387
  	if (CPUCLOCK_PERTHREAD(new_timer->it_clock)) {
  		if (pid == 0) {
  			p = current;
  		} else {
8dc86af00   Pavel Emelyanov   Use find_task_by_...
388
  			p = find_task_by_vpid(pid);
bac0abd61   Pavel Emelyanov   Isolate some expl...
389
  			if (p && !same_thread_group(p, current))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
392
393
394
395
  				p = NULL;
  		}
  	} else {
  		if (pid == 0) {
  			p = current->group_leader;
  		} else {
8dc86af00   Pavel Emelyanov   Use find_task_by_...
396
  			p = find_task_by_vpid(pid);
c0deae8c9   Sergey Senozhatsky   posix-cpu-timers:...
397
  			if (p && !has_group_leader_pid(p))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
398
399
400
401
402
403
404
405
406
  				p = NULL;
  		}
  	}
  	new_timer->it.cpu.task = p;
  	if (p) {
  		get_task_struct(p);
  	} else {
  		ret = -EINVAL;
  	}
c0deae8c9   Sergey Senozhatsky   posix-cpu-timers:...
407
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
408
409
410
411
412
413
414
415
416
417
  
  	return ret;
  }
  
  /*
   * Clean up a CPU-clock timer that is about to be destroyed.
   * This is called from timer deletion with the timer already locked.
   * If we return TIMER_RETRY, it's necessary to release the timer's lock
   * and try again.  (This happens when the timer is in the middle of firing.)
   */
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
418
  static int posix_cpu_timer_del(struct k_itimer *timer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
420
  {
  	struct task_struct *p = timer->it.cpu.task;
108150ea7   Oleg Nesterov   [PATCH] posix-tim...
421
  	int ret = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422

108150ea7   Oleg Nesterov   [PATCH] posix-tim...
423
  	if (likely(p != NULL)) {
9465bee86   Linus Torvalds   Revert "Fix cpu t...
424
  		read_lock(&tasklist_lock);
d30fda355   Oleg Nesterov   posix-cpu-timers:...
425
  		if (unlikely(p->sighand == NULL)) {
9465bee86   Linus Torvalds   Revert "Fix cpu t...
426
427
428
429
430
431
  			/*
  			 * We raced with the reaping of the task.
  			 * The deletion should have cleared us off the list.
  			 */
  			BUG_ON(!list_empty(&timer->it.cpu.entry));
  		} else {
9465bee86   Linus Torvalds   Revert "Fix cpu t...
432
  			spin_lock(&p->sighand->siglock);
108150ea7   Oleg Nesterov   [PATCH] posix-tim...
433
434
435
436
  			if (timer->it.cpu.firing)
  				ret = TIMER_RETRY;
  			else
  				list_del(&timer->it.cpu.entry);
9465bee86   Linus Torvalds   Revert "Fix cpu t...
437
438
439
  			spin_unlock(&p->sighand->siglock);
  		}
  		read_unlock(&tasklist_lock);
108150ea7   Oleg Nesterov   [PATCH] posix-tim...
440
441
442
  
  		if (!ret)
  			put_task_struct(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444

108150ea7   Oleg Nesterov   [PATCH] posix-tim...
445
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
447
448
449
450
451
452
453
454
455
  }
  
  /*
   * Clean out CPU timers still ticking when a thread exited.  The task
   * pointer is cleared, and the expiry time is replaced with the residual
   * time for later timer_gettime calls to return.
   * This must be called with the siglock held.
   */
  static void cleanup_timers(struct list_head *head,
  			   cputime_t utime, cputime_t stime,
41b86e9c5   Ingo Molnar   sched: make posix...
456
  			   unsigned long long sum_exec_runtime)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
458
459
460
461
  {
  	struct cpu_timer_list *timer, *next;
  	cputime_t ptime = cputime_add(utime, stime);
  
  	list_for_each_entry_safe(timer, next, head, entry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
463
464
465
466
467
468
469
470
471
472
  		list_del_init(&timer->entry);
  		if (cputime_lt(timer->expires.cpu, ptime)) {
  			timer->expires.cpu = cputime_zero;
  		} else {
  			timer->expires.cpu = cputime_sub(timer->expires.cpu,
  							 ptime);
  		}
  	}
  
  	++head;
  	list_for_each_entry_safe(timer, next, head, entry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
473
474
475
476
477
478
479
480
481
482
483
  		list_del_init(&timer->entry);
  		if (cputime_lt(timer->expires.cpu, utime)) {
  			timer->expires.cpu = cputime_zero;
  		} else {
  			timer->expires.cpu = cputime_sub(timer->expires.cpu,
  							 utime);
  		}
  	}
  
  	++head;
  	list_for_each_entry_safe(timer, next, head, entry) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484
  		list_del_init(&timer->entry);
41b86e9c5   Ingo Molnar   sched: make posix...
485
  		if (timer->expires.sched < sum_exec_runtime) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
487
  			timer->expires.sched = 0;
  		} else {
41b86e9c5   Ingo Molnar   sched: make posix...
488
  			timer->expires.sched -= sum_exec_runtime;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
489
490
491
492
493
494
495
496
497
498
499
500
  		}
  	}
  }
  
  /*
   * These are both called with the siglock held, when the current thread
   * is being reaped.  When the final (leader) thread in the group is reaped,
   * posix_cpu_timers_exit_group will be called after posix_cpu_timers_exit.
   */
  void posix_cpu_timers_exit(struct task_struct *tsk)
  {
  	cleanup_timers(tsk->cpu_timers,
41b86e9c5   Ingo Molnar   sched: make posix...
501
  		       tsk->utime, tsk->stime, tsk->se.sum_exec_runtime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
502
503
504
505
  
  }
  void posix_cpu_timers_exit_group(struct task_struct *tsk)
  {
17d42c1c4   Stanislaw Gruszka   posix_cpu_timers_...
506
  	struct signal_struct *const sig = tsk->signal;
ca531a0a5   Oleg Nesterov   [PATCH] posix-tim...
507

f06febc96   Frank Mayhar   timers: fix itime...
508
  	cleanup_timers(tsk->signal->cpu_timers,
17d42c1c4   Stanislaw Gruszka   posix_cpu_timers_...
509
510
511
  		       cputime_add(tsk->utime, sig->utime),
  		       cputime_add(tsk->stime, sig->stime),
  		       tsk->se.sum_exec_runtime + sig->sum_sched_runtime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
513
514
515
516
517
518
519
520
521
522
523
524
525
  }
  
  static void clear_dead_task(struct k_itimer *timer, union cpu_time_count now)
  {
  	/*
  	 * That's all for this thread or process.
  	 * We leave our residual in expires to be reported.
  	 */
  	put_task_struct(timer->it.cpu.task);
  	timer->it.cpu.task = NULL;
  	timer->it.cpu.expires = cpu_time_sub(timer->it_clock,
  					     timer->it.cpu.expires,
  					     now);
  }
d1e3b6d19   Stanislaw Gruszka   itimers: Simplify...
526
527
528
529
530
  static inline int expires_gt(cputime_t expires, cputime_t new_exp)
  {
  	return cputime_eq(expires, cputime_zero) ||
  	       cputime_gt(expires, new_exp);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
532
533
  /*
   * Insert the timer on the appropriate list before any timers that
   * expire later.  This must be called with the tasklist_lock held
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
534
   * for reading, interrupts disabled and p->sighand->siglock taken.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
   */
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
536
  static void arm_timer(struct k_itimer *timer)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
538
539
  {
  	struct task_struct *p = timer->it.cpu.task;
  	struct list_head *head, *listpos;
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
540
  	struct task_cputime *cputime_expires;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
542
  	struct cpu_timer_list *const nt = &timer->it.cpu;
  	struct cpu_timer_list *next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543

5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
544
545
546
547
548
549
550
  	if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
  		head = p->cpu_timers;
  		cputime_expires = &p->cputime_expires;
  	} else {
  		head = p->signal->cpu_timers;
  		cputime_expires = &p->signal->cputime_expires;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551
  	head += CPUCLOCK_WHICH(timer->it_clock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
  	listpos = head;
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
553
554
555
556
  	list_for_each_entry(next, head, entry) {
  		if (cpu_time_before(timer->it_clock, nt->expires, next->expires))
  			break;
  		listpos = &next->entry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
559
560
  	}
  	list_add(&nt->entry, listpos);
  
  	if (listpos == head) {
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
561
  		union cpu_time_count *exp = &nt->expires;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
562
  		/*
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
563
564
565
566
  		 * We are the new earliest-expiring POSIX 1.b timer, hence
  		 * need to update expiration cache. Take into account that
  		 * for process timers we share expiration cache with itimers
  		 * and RLIMIT_CPU and for thread timers with RLIMIT_RTTIME.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
567
  		 */
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
568
569
570
571
572
573
574
575
576
577
578
579
580
581
  		switch (CPUCLOCK_WHICH(timer->it_clock)) {
  		case CPUCLOCK_PROF:
  			if (expires_gt(cputime_expires->prof_exp, exp->cpu))
  				cputime_expires->prof_exp = exp->cpu;
  			break;
  		case CPUCLOCK_VIRT:
  			if (expires_gt(cputime_expires->virt_exp, exp->cpu))
  				cputime_expires->virt_exp = exp->cpu;
  			break;
  		case CPUCLOCK_SCHED:
  			if (cputime_expires->sched_exp == 0 ||
  			    cputime_expires->sched_exp > exp->sched)
  				cputime_expires->sched_exp = exp->sched;
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
582
583
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
584
585
586
587
588
589
590
  }
  
  /*
   * The timer is locked, fire it and arrange for its reload.
   */
  static void cpu_timer_fire(struct k_itimer *timer)
  {
1f169f84d   Stanislaw Gruszka   cpu-timers: Chang...
591
592
593
594
595
596
  	if ((timer->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE) {
  		/*
  		 * User don't want any signal.
  		 */
  		timer->it.cpu.expires.sched = 0;
  	} else if (unlikely(timer->sigq == NULL)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
  		/*
  		 * This a special case for clock_nanosleep,
  		 * not a normal timer from sys_timer_create.
  		 */
  		wake_up_process(timer->it_process);
  		timer->it.cpu.expires.sched = 0;
  	} else if (timer->it.cpu.incr.sched == 0) {
  		/*
  		 * One-shot timer.  Clear it as soon as it's fired.
  		 */
  		posix_timer_event(timer, 0);
  		timer->it.cpu.expires.sched = 0;
  	} else if (posix_timer_event(timer, ++timer->it_requeue_pending)) {
  		/*
  		 * The signal did not get queued because the signal
  		 * was ignored, so we won't get any callback to
  		 * reload the timer.  But we need to keep it
  		 * ticking in case the signal is deliverable next time.
  		 */
  		posix_cpu_timer_schedule(timer);
  	}
  }
  
  /*
3997ad317   Peter Zijlstra   timers: more cons...
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
   * Sample a process (thread group) timer for the given group_leader task.
   * Must be called with tasklist_lock held for reading.
   */
  static int cpu_timer_sample_group(const clockid_t which_clock,
  				  struct task_struct *p,
  				  union cpu_time_count *cpu)
  {
  	struct task_cputime cputime;
  
  	thread_group_cputimer(p, &cputime);
  	switch (CPUCLOCK_WHICH(which_clock)) {
  	default:
  		return -EINVAL;
  	case CPUCLOCK_PROF:
  		cpu->cpu = cputime_add(cputime.utime, cputime.stime);
  		break;
  	case CPUCLOCK_VIRT:
  		cpu->cpu = cputime.utime;
  		break;
  	case CPUCLOCK_SCHED:
  		cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p);
  		break;
  	}
  	return 0;
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
648
649
650
651
652
   * Guts of sys_timer_settime for CPU timers.
   * This is called with the timer locked and interrupts disabled.
   * If we return TIMER_RETRY, it's necessary to release the timer's lock
   * and try again.  (This happens when the timer is in the middle of firing.)
   */
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
653
654
  static int posix_cpu_timer_set(struct k_itimer *timer, int flags,
  			       struct itimerspec *new, struct itimerspec *old)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
655
656
  {
  	struct task_struct *p = timer->it.cpu.task;
ae1a78eec   Stanislaw Gruszka   cpu-timers: Retur...
657
  	union cpu_time_count old_expires, new_expires, old_incr, val;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
658
659
660
661
662
663
664
665
666
667
668
669
670
671
  	int ret;
  
  	if (unlikely(p == NULL)) {
  		/*
  		 * Timer refers to a dead task's clock.
  		 */
  		return -ESRCH;
  	}
  
  	new_expires = timespec_to_sample(timer->it_clock, &new->it_value);
  
  	read_lock(&tasklist_lock);
  	/*
  	 * We need the tasklist_lock to protect against reaping that
d30fda355   Oleg Nesterov   posix-cpu-timers:...
672
  	 * clears p->sighand.  If p has just been reaped, we can no
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673
674
  	 * longer get any information about it at all.
  	 */
d30fda355   Oleg Nesterov   posix-cpu-timers:...
675
  	if (unlikely(p->sighand == NULL)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676
677
678
679
680
681
682
683
684
685
  		read_unlock(&tasklist_lock);
  		put_task_struct(p);
  		timer->it.cpu.task = NULL;
  		return -ESRCH;
  	}
  
  	/*
  	 * Disarm any old timer after extracting its expiry time.
  	 */
  	BUG_ON(!irqs_disabled());
a69ac4a78   Oleg Nesterov   [PATCH] posix-tim...
686
687
  
  	ret = 0;
ae1a78eec   Stanislaw Gruszka   cpu-timers: Retur...
688
  	old_incr = timer->it.cpu.incr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
690
  	spin_lock(&p->sighand->siglock);
  	old_expires = timer->it.cpu.expires;
a69ac4a78   Oleg Nesterov   [PATCH] posix-tim...
691
692
693
694
695
  	if (unlikely(timer->it.cpu.firing)) {
  		timer->it.cpu.firing = -1;
  		ret = TIMER_RETRY;
  	} else
  		list_del_init(&timer->it.cpu.entry);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
696
697
698
699
700
701
702
703
704
705
706
707
  
  	/*
  	 * We need to sample the current value to convert the new
  	 * value from to relative and absolute, and to convert the
  	 * old value from absolute to relative.  To set a process
  	 * timer, we need a sample to balance the thread expiry
  	 * times (in arm_timer).  With an absolute time, we must
  	 * check if it's already passed.  In short, we need a sample.
  	 */
  	if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
  		cpu_clock_sample(timer->it_clock, p, &val);
  	} else {
3997ad317   Peter Zijlstra   timers: more cons...
708
  		cpu_timer_sample_group(timer->it_clock, p, &val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
  	}
  
  	if (old) {
  		if (old_expires.sched == 0) {
  			old->it_value.tv_sec = 0;
  			old->it_value.tv_nsec = 0;
  		} else {
  			/*
  			 * Update the timer in case it has
  			 * overrun already.  If it has,
  			 * we'll report it as having overrun
  			 * and with the next reloaded timer
  			 * already ticking, though we are
  			 * swallowing that pending
  			 * notification here to install the
  			 * new setting.
  			 */
  			bump_cpu_timer(timer, val);
  			if (cpu_time_before(timer->it_clock, val,
  					    timer->it.cpu.expires)) {
  				old_expires = cpu_time_sub(
  					timer->it_clock,
  					timer->it.cpu.expires, val);
  				sample_to_timespec(timer->it_clock,
  						   old_expires,
  						   &old->it_value);
  			} else {
  				old->it_value.tv_nsec = 1;
  				old->it_value.tv_sec = 0;
  			}
  		}
  	}
a69ac4a78   Oleg Nesterov   [PATCH] posix-tim...
741
  	if (unlikely(ret)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
742
743
744
745
746
747
  		/*
  		 * We are colliding with the timer actually firing.
  		 * Punt after filling in the timer's old value, and
  		 * disable this firing since we are already reporting
  		 * it as an overrun (thanks to bump_cpu_timer above).
  		 */
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
748
  		spin_unlock(&p->sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
749
  		read_unlock(&tasklist_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
751
752
753
754
755
756
757
758
759
760
761
762
763
  		goto out;
  	}
  
  	if (new_expires.sched != 0 && !(flags & TIMER_ABSTIME)) {
  		cpu_time_add(timer->it_clock, &new_expires, val);
  	}
  
  	/*
  	 * Install the new expiry time (or zero).
  	 * For a timer with no notification action, we don't actually
  	 * arm the timer (we'll just fake it for timer_gettime).
  	 */
  	timer->it.cpu.expires = new_expires;
  	if (new_expires.sched != 0 &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
764
  	    cpu_time_before(timer->it_clock, val, new_expires)) {
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
765
  		arm_timer(timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
766
  	}
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
767
  	spin_unlock(&p->sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
  	read_unlock(&tasklist_lock);
  
  	/*
  	 * Install the new reload setting, and
  	 * set up the signal and overrun bookkeeping.
  	 */
  	timer->it.cpu.incr = timespec_to_sample(timer->it_clock,
  						&new->it_interval);
  
  	/*
  	 * This acts as a modification timestamp for the timer,
  	 * so any automatic reload attempt will punt on seeing
  	 * that we have reset the timer manually.
  	 */
  	timer->it_requeue_pending = (timer->it_requeue_pending + 2) &
  		~REQUEUE_PENDING;
  	timer->it_overrun_last = 0;
  	timer->it_overrun = -1;
  
  	if (new_expires.sched != 0 &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788
789
790
791
792
793
794
795
796
797
798
799
800
  	    !cpu_time_before(timer->it_clock, val, new_expires)) {
  		/*
  		 * The designated time already passed, so we notify
  		 * immediately, even if the thread never runs to
  		 * accumulate more time on this clock.
  		 */
  		cpu_timer_fire(timer);
  	}
  
  	ret = 0;
   out:
  	if (old) {
  		sample_to_timespec(timer->it_clock,
ae1a78eec   Stanislaw Gruszka   cpu-timers: Retur...
801
  				   old_incr, &old->it_interval);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
802
803
804
  	}
  	return ret;
  }
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
805
  static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
  {
  	union cpu_time_count now;
  	struct task_struct *p = timer->it.cpu.task;
  	int clear_dead;
  
  	/*
  	 * Easy part: convert the reload time.
  	 */
  	sample_to_timespec(timer->it_clock,
  			   timer->it.cpu.incr, &itp->it_interval);
  
  	if (timer->it.cpu.expires.sched == 0) {	/* Timer not armed at all.  */
  		itp->it_value.tv_sec = itp->it_value.tv_nsec = 0;
  		return;
  	}
  
  	if (unlikely(p == NULL)) {
  		/*
  		 * This task already died and the timer will never fire.
  		 * In this case, expires is actually the dead value.
  		 */
  	dead:
  		sample_to_timespec(timer->it_clock, timer->it.cpu.expires,
  				   &itp->it_value);
  		return;
  	}
  
  	/*
  	 * Sample the clock to take the difference with the expiry time.
  	 */
  	if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
  		cpu_clock_sample(timer->it_clock, p, &now);
  		clear_dead = p->exit_state;
  	} else {
  		read_lock(&tasklist_lock);
d30fda355   Oleg Nesterov   posix-cpu-timers:...
841
  		if (unlikely(p->sighand == NULL)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
842
843
844
845
846
847
848
849
850
851
852
  			/*
  			 * The process has been reaped.
  			 * We can't even collect a sample any more.
  			 * Call the timer disarmed, nothing else to do.
  			 */
  			put_task_struct(p);
  			timer->it.cpu.task = NULL;
  			timer->it.cpu.expires.sched = 0;
  			read_unlock(&tasklist_lock);
  			goto dead;
  		} else {
3997ad317   Peter Zijlstra   timers: more cons...
853
  			cpu_timer_sample_group(timer->it_clock, p, &now);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
854
855
856
857
858
  			clear_dead = (unlikely(p->exit_state) &&
  				      thread_group_empty(p));
  		}
  		read_unlock(&tasklist_lock);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
  	if (unlikely(clear_dead)) {
  		/*
  		 * We've noticed that the thread is dead, but
  		 * not yet reaped.  Take this opportunity to
  		 * drop our task ref.
  		 */
  		clear_dead_task(timer, now);
  		goto dead;
  	}
  
  	if (cpu_time_before(timer->it_clock, now, timer->it.cpu.expires)) {
  		sample_to_timespec(timer->it_clock,
  				   cpu_time_sub(timer->it_clock,
  						timer->it.cpu.expires, now),
  				   &itp->it_value);
  	} else {
  		/*
  		 * The timer should have expired already, but the firing
  		 * hasn't taken place yet.  Say it's just about to expire.
  		 */
  		itp->it_value.tv_nsec = 1;
  		itp->it_value.tv_sec = 0;
  	}
  }
  
  /*
   * Check for any per-thread CPU timers that have fired and move them off
   * the tsk->cpu_timers[N] list onto the firing list.  Here we update the
   * tsk->it_*_expires values to reflect the remaining thread CPU timers.
   */
  static void check_thread_timers(struct task_struct *tsk,
  				struct list_head *firing)
  {
e80eda94d   Linus Torvalds   Posix timers: lim...
892
  	int maxfire;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893
  	struct list_head *timers = tsk->cpu_timers;
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
894
  	struct signal_struct *const sig = tsk->signal;
d4bb52743   Jiri Slaby   posix-cpu-timers:...
895
  	unsigned long soft;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896

e80eda94d   Linus Torvalds   Posix timers: lim...
897
  	maxfire = 20;
f06febc96   Frank Mayhar   timers: fix itime...
898
  	tsk->cputime_expires.prof_exp = cputime_zero;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
899
  	while (!list_empty(timers)) {
b5e618181   Pavel Emelianov   Introduce a handy...
900
  		struct cpu_timer_list *t = list_first_entry(timers,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
901
902
  						      struct cpu_timer_list,
  						      entry);
e80eda94d   Linus Torvalds   Posix timers: lim...
903
  		if (!--maxfire || cputime_lt(prof_ticks(tsk), t->expires.cpu)) {
f06febc96   Frank Mayhar   timers: fix itime...
904
  			tsk->cputime_expires.prof_exp = t->expires.cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
905
906
907
908
909
910
911
  			break;
  		}
  		t->firing = 1;
  		list_move_tail(&t->entry, firing);
  	}
  
  	++timers;
e80eda94d   Linus Torvalds   Posix timers: lim...
912
  	maxfire = 20;
f06febc96   Frank Mayhar   timers: fix itime...
913
  	tsk->cputime_expires.virt_exp = cputime_zero;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
914
  	while (!list_empty(timers)) {
b5e618181   Pavel Emelianov   Introduce a handy...
915
  		struct cpu_timer_list *t = list_first_entry(timers,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916
917
  						      struct cpu_timer_list,
  						      entry);
e80eda94d   Linus Torvalds   Posix timers: lim...
918
  		if (!--maxfire || cputime_lt(virt_ticks(tsk), t->expires.cpu)) {
f06febc96   Frank Mayhar   timers: fix itime...
919
  			tsk->cputime_expires.virt_exp = t->expires.cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
921
922
923
924
925
926
  			break;
  		}
  		t->firing = 1;
  		list_move_tail(&t->entry, firing);
  	}
  
  	++timers;
e80eda94d   Linus Torvalds   Posix timers: lim...
927
  	maxfire = 20;
f06febc96   Frank Mayhar   timers: fix itime...
928
  	tsk->cputime_expires.sched_exp = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
  	while (!list_empty(timers)) {
b5e618181   Pavel Emelianov   Introduce a handy...
930
  		struct cpu_timer_list *t = list_first_entry(timers,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
931
932
  						      struct cpu_timer_list,
  						      entry);
41b86e9c5   Ingo Molnar   sched: make posix...
933
  		if (!--maxfire || tsk->se.sum_exec_runtime < t->expires.sched) {
f06febc96   Frank Mayhar   timers: fix itime...
934
  			tsk->cputime_expires.sched_exp = t->expires.sched;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
936
937
938
939
  			break;
  		}
  		t->firing = 1;
  		list_move_tail(&t->entry, firing);
  	}
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
940
941
942
943
  
  	/*
  	 * Check for the special case thread timers.
  	 */
78d7d407b   Jiri Slaby   kernel core: use ...
944
  	soft = ACCESS_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_cur);
d4bb52743   Jiri Slaby   posix-cpu-timers:...
945
  	if (soft != RLIM_INFINITY) {
78d7d407b   Jiri Slaby   kernel core: use ...
946
947
  		unsigned long hard =
  			ACCESS_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_max);
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
948

5a52dd500   Peter Zijlstra   sched: rt-watchdo...
949
950
  		if (hard != RLIM_INFINITY &&
  		    tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) {
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
951
952
953
954
955
956
957
  			/*
  			 * At the hard limit, we just die.
  			 * No need to calculate anything else now.
  			 */
  			__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
  			return;
  		}
d4bb52743   Jiri Slaby   posix-cpu-timers:...
958
  		if (tsk->rt.timeout > DIV_ROUND_UP(soft, USEC_PER_SEC/HZ)) {
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
959
960
961
  			/*
  			 * At the soft limit, send a SIGXCPU every second.
  			 */
d4bb52743   Jiri Slaby   posix-cpu-timers:...
962
963
964
  			if (soft < hard) {
  				soft += USEC_PER_SEC;
  				sig->rlim[RLIMIT_RTTIME].rlim_cur = soft;
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
965
  			}
81d50bb25   Hiroshi Shimamoto   posix-timers: pri...
966
967
968
969
  			printk(KERN_INFO
  				"RT Watchdog Timeout: %s[%d]
  ",
  				tsk->comm, task_pid_nr(tsk));
78f2c7db6   Peter Zijlstra   sched: SCHED_FIFO...
970
971
972
  			__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
  }
15365c108   Stanislaw Gruszka   posix-cpu-timers:...
974
  static void stop_process_timers(struct signal_struct *sig)
3fccfd67d   Peter Zijlstra   timers: split pro...
975
  {
15365c108   Stanislaw Gruszka   posix-cpu-timers:...
976
  	struct thread_group_cputimer *cputimer = &sig->cputimer;
3fccfd67d   Peter Zijlstra   timers: split pro...
977
  	unsigned long flags;
3fccfd67d   Peter Zijlstra   timers: split pro...
978
979
980
981
  	spin_lock_irqsave(&cputimer->lock, flags);
  	cputimer->running = 0;
  	spin_unlock_irqrestore(&cputimer->lock, flags);
  }
8356b5f9c   Stanislaw Gruszka   itimers: Fix peri...
982
  static u32 onecputick;
42c4ab41a   Stanislaw Gruszka   itimers: Merge IT...
983
984
985
986
987
988
989
  static void check_cpu_itimer(struct task_struct *tsk, struct cpu_itimer *it,
  			     cputime_t *expires, cputime_t cur_time, int signo)
  {
  	if (cputime_eq(it->expires, cputime_zero))
  		return;
  
  	if (cputime_ge(cur_time, it->expires)) {
8356b5f9c   Stanislaw Gruszka   itimers: Fix peri...
990
991
992
993
994
  		if (!cputime_eq(it->incr, cputime_zero)) {
  			it->expires = cputime_add(it->expires, it->incr);
  			it->error += it->incr_error;
  			if (it->error >= onecputick) {
  				it->expires = cputime_sub(it->expires,
a42548a18   Stanislaw Gruszka   cputime: Optimize...
995
  							  cputime_one_jiffy);
8356b5f9c   Stanislaw Gruszka   itimers: Fix peri...
996
997
  				it->error -= onecputick;
  			}
3f0a525eb   Xiao Guangrong   itimers: Add trac...
998
  		} else {
8356b5f9c   Stanislaw Gruszka   itimers: Fix peri...
999
  			it->expires = cputime_zero;
3f0a525eb   Xiao Guangrong   itimers: Add trac...
1000
  		}
42c4ab41a   Stanislaw Gruszka   itimers: Merge IT...
1001

3f0a525eb   Xiao Guangrong   itimers: Add trac...
1002
1003
1004
  		trace_itimer_expire(signo == SIGPROF ?
  				    ITIMER_PROF : ITIMER_VIRTUAL,
  				    tsk->signal->leader_pid, cur_time);
42c4ab41a   Stanislaw Gruszka   itimers: Merge IT...
1005
1006
1007
1008
1009
1010
1011
1012
1013
  		__group_send_sig_info(signo, SEND_SIG_PRIV, tsk);
  	}
  
  	if (!cputime_eq(it->expires, cputime_zero) &&
  	    (cputime_eq(*expires, cputime_zero) ||
  	     cputime_lt(it->expires, *expires))) {
  		*expires = it->expires;
  	}
  }
29f87b793   Stanislaw Gruszka   posix-cpu-timers:...
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
  /**
   * task_cputime_zero - Check a task_cputime struct for all zero fields.
   *
   * @cputime:	The struct to compare.
   *
   * Checks @cputime to see if all fields are zero.  Returns true if all fields
   * are zero, false if any field is nonzero.
   */
  static inline int task_cputime_zero(const struct task_cputime *cputime)
  {
  	if (cputime_eq(cputime->utime, cputime_zero) &&
  	    cputime_eq(cputime->stime, cputime_zero) &&
  	    cputime->sum_exec_runtime == 0)
  		return 1;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1030
1031
1032
1033
1034
1035
1036
1037
  /*
   * Check for any per-thread CPU timers that have fired and move them
   * off the tsk->*_timers list onto the firing list.  Per-thread timers
   * have already been taken off.
   */
  static void check_process_timers(struct task_struct *tsk,
  				 struct list_head *firing)
  {
e80eda94d   Linus Torvalds   Posix timers: lim...
1038
  	int maxfire;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
  	struct signal_struct *const sig = tsk->signal;
f06febc96   Frank Mayhar   timers: fix itime...
1040
  	cputime_t utime, ptime, virt_expires, prof_expires;
41b86e9c5   Ingo Molnar   sched: make posix...
1041
  	unsigned long long sum_sched_runtime, sched_expires;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1042
  	struct list_head *timers = sig->cpu_timers;
f06febc96   Frank Mayhar   timers: fix itime...
1043
  	struct task_cputime cputime;
d4bb52743   Jiri Slaby   posix-cpu-timers:...
1044
  	unsigned long soft;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1045
1046
  
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1047
1048
  	 * Collect the current process totals.
  	 */
4cd4c1b40   Peter Zijlstra   timers: split pro...
1049
  	thread_group_cputimer(tsk, &cputime);
f06febc96   Frank Mayhar   timers: fix itime...
1050
1051
1052
  	utime = cputime.utime;
  	ptime = cputime_add(utime, cputime.stime);
  	sum_sched_runtime = cputime.sum_exec_runtime;
e80eda94d   Linus Torvalds   Posix timers: lim...
1053
  	maxfire = 20;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1054
1055
  	prof_expires = cputime_zero;
  	while (!list_empty(timers)) {
ee7dd205b   WANG Cong   posix-timers: fix...
1056
  		struct cpu_timer_list *tl = list_first_entry(timers,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1057
1058
  						      struct cpu_timer_list,
  						      entry);
ee7dd205b   WANG Cong   posix-timers: fix...
1059
1060
  		if (!--maxfire || cputime_lt(ptime, tl->expires.cpu)) {
  			prof_expires = tl->expires.cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1061
1062
  			break;
  		}
ee7dd205b   WANG Cong   posix-timers: fix...
1063
1064
  		tl->firing = 1;
  		list_move_tail(&tl->entry, firing);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
1066
1067
  	}
  
  	++timers;
e80eda94d   Linus Torvalds   Posix timers: lim...
1068
  	maxfire = 20;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1069
1070
  	virt_expires = cputime_zero;
  	while (!list_empty(timers)) {
ee7dd205b   WANG Cong   posix-timers: fix...
1071
  		struct cpu_timer_list *tl = list_first_entry(timers,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1072
1073
  						      struct cpu_timer_list,
  						      entry);
ee7dd205b   WANG Cong   posix-timers: fix...
1074
1075
  		if (!--maxfire || cputime_lt(utime, tl->expires.cpu)) {
  			virt_expires = tl->expires.cpu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1076
1077
  			break;
  		}
ee7dd205b   WANG Cong   posix-timers: fix...
1078
1079
  		tl->firing = 1;
  		list_move_tail(&tl->entry, firing);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080
1081
1082
  	}
  
  	++timers;
e80eda94d   Linus Torvalds   Posix timers: lim...
1083
  	maxfire = 20;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084
1085
  	sched_expires = 0;
  	while (!list_empty(timers)) {
ee7dd205b   WANG Cong   posix-timers: fix...
1086
  		struct cpu_timer_list *tl = list_first_entry(timers,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087
1088
  						      struct cpu_timer_list,
  						      entry);
ee7dd205b   WANG Cong   posix-timers: fix...
1089
1090
  		if (!--maxfire || sum_sched_runtime < tl->expires.sched) {
  			sched_expires = tl->expires.sched;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
1092
  			break;
  		}
ee7dd205b   WANG Cong   posix-timers: fix...
1093
1094
  		tl->firing = 1;
  		list_move_tail(&tl->entry, firing);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1095
1096
1097
1098
1099
  	}
  
  	/*
  	 * Check for the special case process timers.
  	 */
42c4ab41a   Stanislaw Gruszka   itimers: Merge IT...
1100
1101
1102
1103
  	check_cpu_itimer(tsk, &sig->it[CPUCLOCK_PROF], &prof_expires, ptime,
  			 SIGPROF);
  	check_cpu_itimer(tsk, &sig->it[CPUCLOCK_VIRT], &virt_expires, utime,
  			 SIGVTALRM);
78d7d407b   Jiri Slaby   kernel core: use ...
1104
  	soft = ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_cur);
d4bb52743   Jiri Slaby   posix-cpu-timers:...
1105
  	if (soft != RLIM_INFINITY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
  		unsigned long psecs = cputime_to_secs(ptime);
78d7d407b   Jiri Slaby   kernel core: use ...
1107
1108
  		unsigned long hard =
  			ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_max);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1109
  		cputime_t x;
d4bb52743   Jiri Slaby   posix-cpu-timers:...
1110
  		if (psecs >= hard) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1111
1112
1113
1114
1115
1116
1117
  			/*
  			 * At the hard limit, we just die.
  			 * No need to calculate anything else now.
  			 */
  			__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
  			return;
  		}
d4bb52743   Jiri Slaby   posix-cpu-timers:...
1118
  		if (psecs >= soft) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1119
1120
1121
1122
  			/*
  			 * At the soft limit, send a SIGXCPU every second.
  			 */
  			__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
d4bb52743   Jiri Slaby   posix-cpu-timers:...
1123
1124
1125
  			if (soft < hard) {
  				soft++;
  				sig->rlim[RLIMIT_CPU].rlim_cur = soft;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1126
1127
  			}
  		}
d4bb52743   Jiri Slaby   posix-cpu-timers:...
1128
  		x = secs_to_cputime(soft);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1129
1130
1131
1132
1133
  		if (cputime_eq(prof_expires, cputime_zero) ||
  		    cputime_lt(x, prof_expires)) {
  			prof_expires = x;
  		}
  	}
29f87b793   Stanislaw Gruszka   posix-cpu-timers:...
1134
1135
1136
1137
1138
  	sig->cputime_expires.prof_exp = prof_expires;
  	sig->cputime_expires.virt_exp = virt_expires;
  	sig->cputime_expires.sched_exp = sched_expires;
  	if (task_cputime_zero(&sig->cputime_expires))
  		stop_process_timers(sig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
  }
  
  /*
   * This is called from the signal code (via do_schedule_next_timer)
   * when the last timer signal was delivered and we have to reload the timer.
   */
  void posix_cpu_timer_schedule(struct k_itimer *timer)
  {
  	struct task_struct *p = timer->it.cpu.task;
  	union cpu_time_count now;
  
  	if (unlikely(p == NULL))
  		/*
  		 * The task was cleaned up already, no future firings.
  		 */
708f430dc   Roland McGrath   [PATCH] posix-cpu...
1154
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
1157
1158
1159
1160
1161
1162
1163
  
  	/*
  	 * Fetch the current sample and update the timer's expiry time.
  	 */
  	if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
  		cpu_clock_sample(timer->it_clock, p, &now);
  		bump_cpu_timer(timer, now);
  		if (unlikely(p->exit_state)) {
  			clear_dead_task(timer, now);
708f430dc   Roland McGrath   [PATCH] posix-cpu...
1164
  			goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1165
1166
  		}
  		read_lock(&tasklist_lock); /* arm_timer needs it.  */
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
1167
  		spin_lock(&p->sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1168
1169
  	} else {
  		read_lock(&tasklist_lock);
d30fda355   Oleg Nesterov   posix-cpu-timers:...
1170
  		if (unlikely(p->sighand == NULL)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1171
1172
1173
1174
1175
1176
1177
  			/*
  			 * The process has been reaped.
  			 * We can't even collect a sample any more.
  			 */
  			put_task_struct(p);
  			timer->it.cpu.task = p = NULL;
  			timer->it.cpu.expires.sched = 0;
708f430dc   Roland McGrath   [PATCH] posix-cpu...
1178
  			goto out_unlock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179
1180
1181
1182
1183
1184
1185
  		} else if (unlikely(p->exit_state) && thread_group_empty(p)) {
  			/*
  			 * We've noticed that the thread is dead, but
  			 * not yet reaped.  Take this opportunity to
  			 * drop our task ref.
  			 */
  			clear_dead_task(timer, now);
708f430dc   Roland McGrath   [PATCH] posix-cpu...
1186
  			goto out_unlock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1187
  		}
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
1188
  		spin_lock(&p->sighand->siglock);
3997ad317   Peter Zijlstra   timers: more cons...
1189
  		cpu_timer_sample_group(timer->it_clock, p, &now);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1190
1191
1192
1193
1194
1195
1196
  		bump_cpu_timer(timer, now);
  		/* Leave the tasklist_lock locked for the call below.  */
  	}
  
  	/*
  	 * Now re-arm for the new expiry time.
  	 */
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
1197
  	BUG_ON(!irqs_disabled());
5eb9aa641   Stanislaw Gruszka   cpu-timers: Clean...
1198
  	arm_timer(timer);
c28739375   Stanislaw Gruszka   cpu-timers: Avoid...
1199
  	spin_unlock(&p->sighand->siglock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1200

708f430dc   Roland McGrath   [PATCH] posix-cpu...
1201
  out_unlock:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1202
  	read_unlock(&tasklist_lock);
708f430dc   Roland McGrath   [PATCH] posix-cpu...
1203
1204
1205
1206
1207
  
  out:
  	timer->it_overrun_last = timer->it_overrun;
  	timer->it_overrun = -1;
  	++timer->it_requeue_pending;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1208
  }
f06febc96   Frank Mayhar   timers: fix itime...
1209
  /**
f06febc96   Frank Mayhar   timers: fix itime...
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
   * task_cputime_expired - Compare two task_cputime entities.
   *
   * @sample:	The task_cputime structure to be checked for expiration.
   * @expires:	Expiration times, against which @sample will be checked.
   *
   * Checks @sample against @expires to see if any field of @sample has expired.
   * Returns true if any field of the former is greater than the corresponding
   * field of the latter if the latter field is set.  Otherwise returns false.
   */
  static inline int task_cputime_expired(const struct task_cputime *sample,
  					const struct task_cputime *expires)
  {
  	if (!cputime_eq(expires->utime, cputime_zero) &&
  	    cputime_ge(sample->utime, expires->utime))
  		return 1;
  	if (!cputime_eq(expires->stime, cputime_zero) &&
  	    cputime_ge(cputime_add(sample->utime, sample->stime),
  		       expires->stime))
  		return 1;
  	if (expires->sum_exec_runtime != 0 &&
  	    sample->sum_exec_runtime >= expires->sum_exec_runtime)
  		return 1;
  	return 0;
  }
  
  /**
   * fastpath_timer_check - POSIX CPU timers fast path.
   *
   * @tsk:	The task (thread) being checked.
f06febc96   Frank Mayhar   timers: fix itime...
1239
   *
bb34d92f6   Frank Mayhar   timers: fix itime...
1240
1241
1242
1243
   * Check the task and thread group timers.  If both are zero (there are no
   * timers set) return false.  Otherwise snapshot the task and thread group
   * timers and compare them with the corresponding expiration times.  Return
   * true if a timer has expired, else return false.
f06febc96   Frank Mayhar   timers: fix itime...
1244
   */
bb34d92f6   Frank Mayhar   timers: fix itime...
1245
  static inline int fastpath_timer_check(struct task_struct *tsk)
f06febc96   Frank Mayhar   timers: fix itime...
1246
  {
ad133ba3d   Oleg Nesterov   sched, signals: f...
1247
  	struct signal_struct *sig;
bb34d92f6   Frank Mayhar   timers: fix itime...
1248

bb34d92f6   Frank Mayhar   timers: fix itime...
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
  	if (!task_cputime_zero(&tsk->cputime_expires)) {
  		struct task_cputime task_sample = {
  			.utime = tsk->utime,
  			.stime = tsk->stime,
  			.sum_exec_runtime = tsk->se.sum_exec_runtime
  		};
  
  		if (task_cputime_expired(&task_sample, &tsk->cputime_expires))
  			return 1;
  	}
ad133ba3d   Oleg Nesterov   sched, signals: f...
1259
1260
  
  	sig = tsk->signal;
29f87b793   Stanislaw Gruszka   posix-cpu-timers:...
1261
  	if (sig->cputimer.running) {
bb34d92f6   Frank Mayhar   timers: fix itime...
1262
  		struct task_cputime group_sample;
8d1f431cb   Oleg Nesterov   sched: Fix the ra...
1263
1264
1265
  		spin_lock(&sig->cputimer.lock);
  		group_sample = sig->cputimer.cputime;
  		spin_unlock(&sig->cputimer.lock);
bb34d92f6   Frank Mayhar   timers: fix itime...
1266
1267
1268
  		if (task_cputime_expired(&group_sample, &sig->cputime_expires))
  			return 1;
  	}
37bebc70d   Oleg Nesterov   posix timers: fix...
1269

f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1270
  	return 0;
f06febc96   Frank Mayhar   timers: fix itime...
1271
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1272
1273
1274
1275
1276
1277
1278
1279
1280
  /*
   * This is called from the timer interrupt handler.  The irq handler has
   * already updated our counts.  We need to check if any timers fire now.
   * Interrupts are disabled.
   */
  void run_posix_cpu_timers(struct task_struct *tsk)
  {
  	LIST_HEAD(firing);
  	struct k_itimer *timer, *next;
0bdd2ed41   Oleg Nesterov   sched: run_posix_...
1281
  	unsigned long flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1282
1283
  
  	BUG_ON(!irqs_disabled());
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284
  	/*
f06febc96   Frank Mayhar   timers: fix itime...
1285
  	 * The fast path checks that there are no expired thread or thread
bb34d92f6   Frank Mayhar   timers: fix itime...
1286
  	 * group timers.  If that's so, just return.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1287
  	 */
bb34d92f6   Frank Mayhar   timers: fix itime...
1288
  	if (!fastpath_timer_check(tsk))
f06febc96   Frank Mayhar   timers: fix itime...
1289
  		return;
5ce73a4a5   Ingo Molnar   timers: fix itime...
1290

0bdd2ed41   Oleg Nesterov   sched: run_posix_...
1291
1292
  	if (!lock_task_sighand(tsk, &flags))
  		return;
bb34d92f6   Frank Mayhar   timers: fix itime...
1293
1294
1295
1296
1297
1298
  	/*
  	 * Here we take off tsk->signal->cpu_timers[N] and
  	 * tsk->cpu_timers[N] all the timers that are firing, and
  	 * put them on the firing list.
  	 */
  	check_thread_timers(tsk, &firing);
29f87b793   Stanislaw Gruszka   posix-cpu-timers:...
1299
1300
1301
1302
1303
1304
  	/*
  	 * If there are any active process wide timers (POSIX 1.b, itimers,
  	 * RLIMIT_CPU) cputimer must be running.
  	 */
  	if (tsk->signal->cputimer.running)
  		check_process_timers(tsk, &firing);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1305

bb34d92f6   Frank Mayhar   timers: fix itime...
1306
1307
1308
1309
1310
1311
1312
1313
  	/*
  	 * We must release these locks before taking any timer's lock.
  	 * There is a potential race with timer deletion here, as the
  	 * siglock now protects our private firing list.  We have set
  	 * the firing flag in each timer, so that a deletion attempt
  	 * that gets the timer lock before we do will give it up and
  	 * spin until we've taken care of that timer below.
  	 */
0bdd2ed41   Oleg Nesterov   sched: run_posix_...
1314
  	unlock_task_sighand(tsk, &flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
1316
1317
  
  	/*
  	 * Now that all the timers on our list have the firing flag,
25985edce   Lucas De Marchi   Fix common misspe...
1318
  	 * no one will touch their list entries but us.  We'll take
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1319
1320
1321
1322
  	 * each timer's lock before clearing its firing flag, so no
  	 * timer call will interfere.
  	 */
  	list_for_each_entry_safe(timer, next, &firing, it.cpu.entry) {
6e85c5ba7   H Hartley Sweeten   kernel/posix-cpu-...
1323
  		int cpu_firing;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1324
1325
  		spin_lock(&timer->it_lock);
  		list_del_init(&timer->it.cpu.entry);
6e85c5ba7   H Hartley Sweeten   kernel/posix-cpu-...
1326
  		cpu_firing = timer->it.cpu.firing;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1327
1328
1329
1330
1331
1332
  		timer->it.cpu.firing = 0;
  		/*
  		 * The firing flag is -1 if we collided with a reset
  		 * of the timer, which already reported this
  		 * almost-firing as an overrun.  So don't generate an event.
  		 */
6e85c5ba7   H Hartley Sweeten   kernel/posix-cpu-...
1333
  		if (likely(cpu_firing >= 0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1334
  			cpu_timer_fire(timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1335
1336
1337
1338
1339
  		spin_unlock(&timer->it_lock);
  	}
  }
  
  /*
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1340
   * Set one of the process-wide special case CPU timers or RLIMIT_CPU.
f06febc96   Frank Mayhar   timers: fix itime...
1341
   * The tsk->sighand->siglock must be held by the caller.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1342
1343
1344
1345
1346
   */
  void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,
  			   cputime_t *newval, cputime_t *oldval)
  {
  	union cpu_time_count now;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347
1348
  
  	BUG_ON(clock_idx == CPUCLOCK_SCHED);
4cd4c1b40   Peter Zijlstra   timers: split pro...
1349
  	cpu_timer_sample_group(clock_idx, tsk, &now);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1350
1351
  
  	if (oldval) {
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1352
1353
1354
1355
1356
  		/*
  		 * We are setting itimer. The *oldval is absolute and we update
  		 * it to be relative, *newval argument is relative and we update
  		 * it to be absolute.
  		 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1357
1358
1359
  		if (!cputime_eq(*oldval, cputime_zero)) {
  			if (cputime_le(*oldval, now.cpu)) {
  				/* Just about to fire. */
a42548a18   Stanislaw Gruszka   cputime: Optimize...
1360
  				*oldval = cputime_one_jiffy;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361
1362
1363
1364
1365
1366
1367
1368
  			} else {
  				*oldval = cputime_sub(*oldval, now.cpu);
  			}
  		}
  
  		if (cputime_eq(*newval, cputime_zero))
  			return;
  		*newval = cputime_add(*newval, now.cpu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1369
1370
1371
  	}
  
  	/*
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1372
1373
  	 * Update expiration cache if we are the earliest timer, or eventually
  	 * RLIMIT_CPU limit is earlier than prof_exp cpu timer expire.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1374
  	 */
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1375
1376
1377
  	switch (clock_idx) {
  	case CPUCLOCK_PROF:
  		if (expires_gt(tsk->signal->cputime_expires.prof_exp, *newval))
f06febc96   Frank Mayhar   timers: fix itime...
1378
  			tsk->signal->cputime_expires.prof_exp = *newval;
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1379
1380
1381
  		break;
  	case CPUCLOCK_VIRT:
  		if (expires_gt(tsk->signal->cputime_expires.virt_exp, *newval))
f06febc96   Frank Mayhar   timers: fix itime...
1382
  			tsk->signal->cputime_expires.virt_exp = *newval;
f55db6090   Stanislaw Gruszka   cpu-timers: Simpl...
1383
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1384
1385
  	}
  }
e4b765551   Toyo Abe   [PATCH] posix-tim...
1386
1387
  static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
  			    struct timespec *rqtp, struct itimerspec *it)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1388
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1389
1390
1391
1392
  	struct k_itimer timer;
  	int error;
  
  	/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1393
1394
1395
1396
1397
1398
1399
1400
1401
  	 * Set up a temporary timer and then wait for it to go off.
  	 */
  	memset(&timer, 0, sizeof timer);
  	spin_lock_init(&timer.it_lock);
  	timer.it_clock = which_clock;
  	timer.it_overrun = -1;
  	error = posix_cpu_timer_create(&timer);
  	timer.it_process = current;
  	if (!error) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1402
  		static struct itimerspec zero_it;
e4b765551   Toyo Abe   [PATCH] posix-tim...
1403
1404
1405
  
  		memset(it, 0, sizeof *it);
  		it->it_value = *rqtp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1406
1407
  
  		spin_lock_irq(&timer.it_lock);
e4b765551   Toyo Abe   [PATCH] posix-tim...
1408
  		error = posix_cpu_timer_set(&timer, flags, it, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
  		if (error) {
  			spin_unlock_irq(&timer.it_lock);
  			return error;
  		}
  
  		while (!signal_pending(current)) {
  			if (timer.it.cpu.expires.sched == 0) {
  				/*
  				 * Our timer fired and was reset.
  				 */
  				spin_unlock_irq(&timer.it_lock);
  				return 0;
  			}
  
  			/*
  			 * Block until cpu_timer_fire (or a signal) wakes us.
  			 */
  			__set_current_state(TASK_INTERRUPTIBLE);
  			spin_unlock_irq(&timer.it_lock);
  			schedule();
  			spin_lock_irq(&timer.it_lock);
  		}
  
  		/*
  		 * We were interrupted by a signal.
  		 */
  		sample_to_timespec(which_clock, timer.it.cpu.expires, rqtp);
e4b765551   Toyo Abe   [PATCH] posix-tim...
1436
  		posix_cpu_timer_set(&timer, 0, &zero_it, it);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1437
  		spin_unlock_irq(&timer.it_lock);
e4b765551   Toyo Abe   [PATCH] posix-tim...
1438
  		if ((it->it_value.tv_sec | it->it_value.tv_nsec) == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1439
1440
1441
1442
1443
  			/*
  			 * It actually did fire already.
  			 */
  			return 0;
  		}
e4b765551   Toyo Abe   [PATCH] posix-tim...
1444
1445
1446
1447
1448
  		error = -ERESTART_RESTARTBLOCK;
  	}
  
  	return error;
  }
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
1449
1450
1451
1452
  static long posix_cpu_nsleep_restart(struct restart_block *restart_block);
  
  static int posix_cpu_nsleep(const clockid_t which_clock, int flags,
  			    struct timespec *rqtp, struct timespec __user *rmtp)
e4b765551   Toyo Abe   [PATCH] posix-tim...
1453
1454
  {
  	struct restart_block *restart_block =
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1455
  		&current_thread_info()->restart_block;
e4b765551   Toyo Abe   [PATCH] posix-tim...
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
  	struct itimerspec it;
  	int error;
  
  	/*
  	 * Diagnose required errors first.
  	 */
  	if (CPUCLOCK_PERTHREAD(which_clock) &&
  	    (CPUCLOCK_PID(which_clock) == 0 ||
  	     CPUCLOCK_PID(which_clock) == current->pid))
  		return -EINVAL;
  
  	error = do_cpu_nanosleep(which_clock, flags, rqtp, &it);
  
  	if (error == -ERESTART_RESTARTBLOCK) {
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1470
  		if (flags & TIMER_ABSTIME)
e4b765551   Toyo Abe   [PATCH] posix-tim...
1471
  			return -ERESTARTNOHAND;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472
  		/*
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1473
1474
1475
  		 * Report back to the user the time still remaining.
  		 */
  		if (rmtp && copy_to_user(rmtp, &it.it_value, sizeof *rmtp))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1476
  			return -EFAULT;
1711ef386   Toyo Abe   [PATCH] posix-tim...
1477
  		restart_block->fn = posix_cpu_nsleep_restart;
ab8177bc5   Thomas Gleixner   hrtimers: Avoid t...
1478
  		restart_block->nanosleep.clockid = which_clock;
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1479
1480
  		restart_block->nanosleep.rmtp = rmtp;
  		restart_block->nanosleep.expires = timespec_to_ns(rqtp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1481
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1482
1483
  	return error;
  }
bc2c8ea48   Thomas Gleixner   posix-timers: Mak...
1484
  static long posix_cpu_nsleep_restart(struct restart_block *restart_block)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1485
  {
ab8177bc5   Thomas Gleixner   hrtimers: Avoid t...
1486
  	clockid_t which_clock = restart_block->nanosleep.clockid;
97735f25d   Thomas Gleixner   [PATCH] hrtimer: ...
1487
  	struct timespec t;
e4b765551   Toyo Abe   [PATCH] posix-tim...
1488
1489
  	struct itimerspec it;
  	int error;
97735f25d   Thomas Gleixner   [PATCH] hrtimer: ...
1490

3751f9f29   Thomas Gleixner   posix-timers: Cle...
1491
  	t = ns_to_timespec(restart_block->nanosleep.expires);
97735f25d   Thomas Gleixner   [PATCH] hrtimer: ...
1492

e4b765551   Toyo Abe   [PATCH] posix-tim...
1493
1494
1495
  	error = do_cpu_nanosleep(which_clock, TIMER_ABSTIME, &t, &it);
  
  	if (error == -ERESTART_RESTARTBLOCK) {
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1496
  		struct timespec __user *rmtp = restart_block->nanosleep.rmtp;
e4b765551   Toyo Abe   [PATCH] posix-tim...
1497
  		/*
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1498
1499
1500
  		 * Report back to the user the time still remaining.
  		 */
  		if (rmtp && copy_to_user(rmtp, &it.it_value, sizeof *rmtp))
e4b765551   Toyo Abe   [PATCH] posix-tim...
1501
  			return -EFAULT;
3751f9f29   Thomas Gleixner   posix-timers: Cle...
1502
  		restart_block->nanosleep.expires = timespec_to_ns(&t);
e4b765551   Toyo Abe   [PATCH] posix-tim...
1503
1504
  	}
  	return error;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1505
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506
1507
  #define PROCESS_CLOCK	MAKE_PROCESS_CPUCLOCK(0, CPUCLOCK_SCHED)
  #define THREAD_CLOCK	MAKE_THREAD_CPUCLOCK(0, CPUCLOCK_SCHED)
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
1508
1509
  static int process_cpu_clock_getres(const clockid_t which_clock,
  				    struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1510
1511
1512
  {
  	return posix_cpu_clock_getres(PROCESS_CLOCK, tp);
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
1513
1514
  static int process_cpu_clock_get(const clockid_t which_clock,
  				 struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1515
1516
1517
1518
1519
1520
1521
1522
  {
  	return posix_cpu_clock_get(PROCESS_CLOCK, tp);
  }
  static int process_cpu_timer_create(struct k_itimer *timer)
  {
  	timer->it_clock = PROCESS_CLOCK;
  	return posix_cpu_timer_create(timer);
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
1523
  static int process_cpu_nsleep(const clockid_t which_clock, int flags,
97735f25d   Thomas Gleixner   [PATCH] hrtimer: ...
1524
1525
  			      struct timespec *rqtp,
  			      struct timespec __user *rmtp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1526
  {
97735f25d   Thomas Gleixner   [PATCH] hrtimer: ...
1527
  	return posix_cpu_nsleep(PROCESS_CLOCK, flags, rqtp, rmtp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1528
  }
1711ef386   Toyo Abe   [PATCH] posix-tim...
1529
1530
1531
1532
  static long process_cpu_nsleep_restart(struct restart_block *restart_block)
  {
  	return -EINVAL;
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
1533
1534
  static int thread_cpu_clock_getres(const clockid_t which_clock,
  				   struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1535
1536
1537
  {
  	return posix_cpu_clock_getres(THREAD_CLOCK, tp);
  }
a924b04dd   Thomas Gleixner   [PATCH] hrtimer: ...
1538
1539
  static int thread_cpu_clock_get(const clockid_t which_clock,
  				struct timespec *tp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1540
1541
1542
1543
1544
1545
1546
1547
  {
  	return posix_cpu_clock_get(THREAD_CLOCK, tp);
  }
  static int thread_cpu_timer_create(struct k_itimer *timer)
  {
  	timer->it_clock = THREAD_CLOCK;
  	return posix_cpu_timer_create(timer);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1548

1976945ee   Thomas Gleixner   posix-timers: Int...
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
  struct k_clock clock_posix_cpu = {
  	.clock_getres	= posix_cpu_clock_getres,
  	.clock_set	= posix_cpu_clock_set,
  	.clock_get	= posix_cpu_clock_get,
  	.timer_create	= posix_cpu_timer_create,
  	.nsleep		= posix_cpu_nsleep,
  	.nsleep_restart	= posix_cpu_nsleep_restart,
  	.timer_set	= posix_cpu_timer_set,
  	.timer_del	= posix_cpu_timer_del,
  	.timer_get	= posix_cpu_timer_get,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1560
1561
1562
  static __init int init_posix_cpu_timers(void)
  {
  	struct k_clock process = {
2fd1f0408   Thomas Gleixner   posix-timers: Cle...
1563
1564
  		.clock_getres	= process_cpu_clock_getres,
  		.clock_get	= process_cpu_clock_get,
2fd1f0408   Thomas Gleixner   posix-timers: Cle...
1565
1566
1567
  		.timer_create	= process_cpu_timer_create,
  		.nsleep		= process_cpu_nsleep,
  		.nsleep_restart	= process_cpu_nsleep_restart,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1568
1569
  	};
  	struct k_clock thread = {
2fd1f0408   Thomas Gleixner   posix-timers: Cle...
1570
1571
  		.clock_getres	= thread_cpu_clock_getres,
  		.clock_get	= thread_cpu_clock_get,
2fd1f0408   Thomas Gleixner   posix-timers: Cle...
1572
  		.timer_create	= thread_cpu_timer_create,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1573
  	};
8356b5f9c   Stanislaw Gruszka   itimers: Fix peri...
1574
  	struct timespec ts;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1575

527087374   Thomas Gleixner   posix-timers: Cle...
1576
1577
  	posix_timers_register_clock(CLOCK_PROCESS_CPUTIME_ID, &process);
  	posix_timers_register_clock(CLOCK_THREAD_CPUTIME_ID, &thread);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1578

a42548a18   Stanislaw Gruszka   cputime: Optimize...
1579
  	cputime_to_timespec(cputime_one_jiffy, &ts);
8356b5f9c   Stanislaw Gruszka   itimers: Fix peri...
1580
1581
  	onecputick = ts.tv_nsec;
  	WARN_ON(ts.tv_sec != 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1582
1583
1584
  	return 0;
  }
  __initcall(init_posix_cpu_timers);