|
@@ -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);
|
|
|
}
|
|
|
|
|
|
/*
|