diff options
Diffstat (limited to 'kernel/posix-cpu-timers.c')
| -rw-r--r-- | kernel/posix-cpu-timers.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 520f6c59948d..d38d9ec3276c 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
| @@ -555,9 +555,6 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now) | |||
| 555 | struct cpu_timer_list *next; | 555 | struct cpu_timer_list *next; |
| 556 | unsigned long i; | 556 | unsigned long i; |
| 557 | 557 | ||
| 558 | if (CPUCLOCK_PERTHREAD(timer->it_clock) && (p->flags & PF_EXITING)) | ||
| 559 | return; | ||
| 560 | |||
| 561 | head = (CPUCLOCK_PERTHREAD(timer->it_clock) ? | 558 | head = (CPUCLOCK_PERTHREAD(timer->it_clock) ? |
| 562 | p->cpu_timers : p->signal->cpu_timers); | 559 | p->cpu_timers : p->signal->cpu_timers); |
| 563 | head += CPUCLOCK_WHICH(timer->it_clock); | 560 | head += CPUCLOCK_WHICH(timer->it_clock); |
| @@ -1173,6 +1170,9 @@ static void check_process_timers(struct task_struct *tsk, | |||
| 1173 | } | 1170 | } |
| 1174 | t = tsk; | 1171 | t = tsk; |
| 1175 | do { | 1172 | do { |
| 1173 | if (unlikely(t->flags & PF_EXITING)) | ||
| 1174 | continue; | ||
| 1175 | |||
| 1176 | ticks = cputime_add(cputime_add(t->utime, t->stime), | 1176 | ticks = cputime_add(cputime_add(t->utime, t->stime), |
| 1177 | prof_left); | 1177 | prof_left); |
| 1178 | if (!cputime_eq(prof_expires, cputime_zero) && | 1178 | if (!cputime_eq(prof_expires, cputime_zero) && |
| @@ -1193,11 +1193,7 @@ static void check_process_timers(struct task_struct *tsk, | |||
| 1193 | t->it_sched_expires > sched)) { | 1193 | t->it_sched_expires > sched)) { |
| 1194 | t->it_sched_expires = sched; | 1194 | t->it_sched_expires = sched; |
| 1195 | } | 1195 | } |
| 1196 | 1196 | } while ((t = next_thread(t)) != tsk); | |
| 1197 | do { | ||
| 1198 | t = next_thread(t); | ||
| 1199 | } while (unlikely(t->flags & PF_EXITING)); | ||
| 1200 | } while (t != tsk); | ||
| 1201 | } | 1197 | } |
| 1202 | } | 1198 | } |
| 1203 | 1199 | ||
| @@ -1289,30 +1285,30 @@ void run_posix_cpu_timers(struct task_struct *tsk) | |||
| 1289 | 1285 | ||
| 1290 | #undef UNEXPIRED | 1286 | #undef UNEXPIRED |
| 1291 | 1287 | ||
| 1292 | BUG_ON(tsk->exit_state); | ||
| 1293 | |||
| 1294 | /* | 1288 | /* |
| 1295 | * Double-check with locks held. | 1289 | * Double-check with locks held. |
| 1296 | */ | 1290 | */ |
| 1297 | read_lock(&tasklist_lock); | 1291 | read_lock(&tasklist_lock); |
| 1298 | spin_lock(&tsk->sighand->siglock); | 1292 | if (likely(tsk->signal != NULL)) { |
| 1293 | spin_lock(&tsk->sighand->siglock); | ||
| 1299 | 1294 | ||
| 1300 | /* | 1295 | /* |
| 1301 | * Here we take off tsk->cpu_timers[N] and tsk->signal->cpu_timers[N] | 1296 | * Here we take off tsk->cpu_timers[N] and tsk->signal->cpu_timers[N] |
| 1302 | * all the timers that are firing, and put them on the firing list. | 1297 | * all the timers that are firing, and put them on the firing list. |
| 1303 | */ | 1298 | */ |
| 1304 | check_thread_timers(tsk, &firing); | 1299 | check_thread_timers(tsk, &firing); |
| 1305 | check_process_timers(tsk, &firing); | 1300 | check_process_timers(tsk, &firing); |
| 1306 | 1301 | ||
| 1307 | /* | 1302 | /* |
| 1308 | * We must release these locks before taking any timer's lock. | 1303 | * We must release these locks before taking any timer's lock. |
| 1309 | * There is a potential race with timer deletion here, as the | 1304 | * There is a potential race with timer deletion here, as the |
| 1310 | * siglock now protects our private firing list. We have set | 1305 | * siglock now protects our private firing list. We have set |
| 1311 | * the firing flag in each timer, so that a deletion attempt | 1306 | * the firing flag in each timer, so that a deletion attempt |
| 1312 | * that gets the timer lock before we do will give it up and | 1307 | * that gets the timer lock before we do will give it up and |
| 1313 | * spin until we've taken care of that timer below. | 1308 | * spin until we've taken care of that timer below. |
| 1314 | */ | 1309 | */ |
| 1315 | spin_unlock(&tsk->sighand->siglock); | 1310 | spin_unlock(&tsk->sighand->siglock); |
| 1311 | } | ||
| 1316 | read_unlock(&tasklist_lock); | 1312 | read_unlock(&tasklist_lock); |
| 1317 | 1313 | ||
| 1318 | /* | 1314 | /* |
