diff options
-rw-r--r-- | kernel/posix-cpu-timers.c | 48 |
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 | ||
402 | static 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 | /* |