aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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/*