Commit 708f430dcc50787d1c0b5c31962a5ff0dd8e35eb

Authored by Roland McGrath
Committed by Linus Torvalds
1 parent a241ec65ae

[PATCH] posix-cpu-timers: fix overrun reporting

This change corrects an omission in posix_cpu_timer_schedule, so that it
correctly propagates the overrun calculation to where it will get reported
to the user.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 1 changed file with 10 additions and 6 deletions Side-by-side Diff

kernel/posix-cpu-timers.c
... ... @@ -1225,7 +1225,7 @@
1225 1225 /*
1226 1226 * The task was cleaned up already, no future firings.
1227 1227 */
1228   - return;
  1228 + goto out;
1229 1229  
1230 1230 /*
1231 1231 * Fetch the current sample and update the timer's expiry time.
... ... @@ -1235,7 +1235,7 @@
1235 1235 bump_cpu_timer(timer, now);
1236 1236 if (unlikely(p->exit_state)) {
1237 1237 clear_dead_task(timer, now);
1238   - return;
  1238 + goto out;
1239 1239 }
1240 1240 read_lock(&tasklist_lock); /* arm_timer needs it. */
1241 1241 } else {
... ... @@ -1248,8 +1248,7 @@
1248 1248 put_task_struct(p);
1249 1249 timer->it.cpu.task = p = NULL;
1250 1250 timer->it.cpu.expires.sched = 0;
1251   - read_unlock(&tasklist_lock);
1252   - return;
  1251 + goto out_unlock;
1253 1252 } else if (unlikely(p->exit_state) && thread_group_empty(p)) {
1254 1253 /*
1255 1254 * We've noticed that the thread is dead, but
... ... @@ -1257,8 +1256,7 @@
1257 1256 * drop our task ref.
1258 1257 */
1259 1258 clear_dead_task(timer, now);
1260   - read_unlock(&tasklist_lock);
1261   - return;
  1259 + goto out_unlock;
1262 1260 }
1263 1261 cpu_clock_sample_group(timer->it_clock, p, &now);
1264 1262 bump_cpu_timer(timer, now);
1265 1263  
... ... @@ -1270,7 +1268,13 @@
1270 1268 */
1271 1269 arm_timer(timer, now);
1272 1270  
  1271 +out_unlock:
1273 1272 read_unlock(&tasklist_lock);
  1273 +
  1274 +out:
  1275 + timer->it_overrun_last = timer->it_overrun;
  1276 + timer->it_overrun = -1;
  1277 + ++timer->it_requeue_pending;
1274 1278 }
1275 1279  
1276 1280 /*