Commit 708f430dcc50787d1c0b5c31962a5ff0dd8e35eb
Committed by
Linus Torvalds
1 parent
a241ec65ae
Exists in
master
and in
7 other branches
[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 | /* |