]> Pileus Git - ~andy/linux/commitdiff
posix_cpu_timers: consolidate timer list cleanups
authorFrederic Weisbecker <fweisbec@gmail.com>
Fri, 28 Jun 2013 00:06:42 +0000 (00:06 +0000)
committerFrederic Weisbecker <fweisbec@gmail.com>
Wed, 3 Jul 2013 14:18:37 +0000 (16:18 +0200)
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>
kernel/posix-cpu-timers.c

index c3c4ea1225a4964688687e49b4f3fd4df086c902..b1450cee6d6d5be88d289999a8e6acaeaa11161c 100644 (file)
@@ -399,6 +399,21 @@ static int posix_cpu_timer_del(struct k_itimer *timer)
        return ret;
 }
 
+static void cleanup_timers_list(struct list_head *head,
+                               unsigned long long curr)
+{
+       struct cpu_timer_list *timer, *next;
+
+       list_for_each_entry_safe(timer, next, head, entry) {
+               list_del_init(&timer->entry);
+               if (timer->expires < curr) {
+                       timer->expires = 0;
+               } else {
+                       timer->expires -= curr;
+               }
+       }
+}
+
 /*
  * Clean out CPU timers still ticking when a thread exited.  The task
  * pointer is cleared, and the expiry time is replaced with the residual
@@ -409,37 +424,12 @@ static void cleanup_timers(struct list_head *head,
                           cputime_t utime, cputime_t stime,
                           unsigned long long sum_exec_runtime)
 {
-       struct cpu_timer_list *timer, *next;
-       cputime_t ptime = utime + stime;
 
-       list_for_each_entry_safe(timer, next, head, entry) {
-               list_del_init(&timer->entry);
-               if (timer->expires < cputime_to_expires(ptime)) {
-                       timer->expires = 0;
-               } else {
-                       timer->expires -= cputime_to_expires(ptime);
-               }
-       }
-
-       ++head;
-       list_for_each_entry_safe(timer, next, head, entry) {
-               list_del_init(&timer->entry);
-               if (timer->expires < cputime_to_expires(utime)) {
-                       timer->expires = 0;
-               } else {
-                       timer->expires -= cputime_to_expires(utime);
-               }
-       }
+       cputime_t ptime = utime + stime;
 
-       ++head;
-       list_for_each_entry_safe(timer, next, head, entry) {
-               list_del_init(&timer->entry);
-               if (timer->expires < sum_exec_runtime) {
-                       timer->expires = 0;
-               } else {
-                       timer->expires -= sum_exec_runtime;
-               }
-       }
+       cleanup_timers_list(head, cputime_to_expires(ptime));
+       cleanup_timers_list(++head, cputime_to_expires(utime));
+       cleanup_timers_list(++head, sum_exec_runtime);
 }
 
 /*