aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2013-06-27 20:06:42 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2013-07-03 10:18:37 -0400
commit1a7fa510b38e518d11365883934f1afa41625424 (patch)
tree0eeb70e41e8416e58aa99a2c68cd3e8735cf2b50 /kernel
parent55ccb616a6e42052edb37e9c4f82cf8854a59429 (diff)
posix_cpu_timers: consolidate timer list cleanups
Cleaning up the posix cpu timers on task exit shares some common code among timer list types, most notably the list traversal and expiry time update. Unify this in a common helper. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Stanislaw Gruszka <sgruszka@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Ingo Molnar <mingo@elte.hu> Cc: Oleg Nesterov <oleg@redhat.com> Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com> Cc: Olivier Langlois <olivier@trillion01.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/posix-cpu-timers.c48
1 files changed, 19 insertions, 29 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c
index c3c4ea1225a4..b1450cee6d6d 100644
--- a/kernel/posix-cpu-timers.c
+++ b/kernel/posix-cpu-timers.c
@@ -399,6 +399,21 @@ static int posix_cpu_timer_del(struct k_itimer *timer)
399 return ret; 399 return ret;
400} 400}
401 401
402static void cleanup_timers_list(struct list_head *head,
403 unsigned long long curr)
404{
405 struct cpu_timer_list *timer, *next;
406
407 list_for_each_entry_safe(timer, next, head, entry) {
408 list_del_init(&timer->entry);
409 if (timer->expires < curr) {
410 timer->expires = 0;
411 } else {
412 timer->expires -= curr;
413 }
414 }
415}
416
402/* 417/*
403 * Clean out CPU timers still ticking when a thread exited. The task 418 * Clean out CPU timers still ticking when a thread exited. The task
404 * pointer is cleared, and the expiry time is replaced with the residual 419 * pointer is cleared, and the expiry time is replaced with the residual
@@ -409,37 +424,12 @@ static void cleanup_timers(struct list_head *head,
409 cputime_t utime, cputime_t stime, 424 cputime_t utime, cputime_t stime,
410 unsigned long long sum_exec_runtime) 425 unsigned long long sum_exec_runtime)
411{ 426{
412 struct cpu_timer_list *timer, *next;
413 cputime_t ptime = utime + stime;
414 427
415 list_for_each_entry_safe(timer, next, head, entry) { 428 cputime_t ptime = utime + stime;
416 list_del_init(&timer->entry);
417 if (timer->expires < cputime_to_expires(ptime)) {
418 timer->expires = 0;
419 } else {
420 timer->expires -= cputime_to_expires(ptime);
421 }
422 }
423
424 ++head;
425 list_for_each_entry_safe(timer, next, head, entry) {
426 list_del_init(&timer->entry);
427 if (timer->expires < cputime_to_expires(utime)) {
428 timer->expires = 0;
429 } else {
430 timer->expires -= cputime_to_expires(utime);
431 }
432 }
433 429
434 ++head; 430 cleanup_timers_list(head, cputime_to_expires(ptime));
435 list_for_each_entry_safe(timer, next, head, entry) { 431 cleanup_timers_list(++head, cputime_to_expires(utime));
436 list_del_init(&timer->entry); 432 cleanup_timers_list(++head, sum_exec_runtime);
437 if (timer->expires < sum_exec_runtime) {
438 timer->expires = 0;
439 } else {
440 timer->expires -= sum_exec_runtime;
441 }
442 }
443} 433}
444 434
445/* 435/*