diff options
author | Roland McGrath <roland@redhat.com> | 2005-10-30 18:03:13 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 20:37:27 -0500 |
commit | 708f430dcc50787d1c0b5c31962a5ff0dd8e35eb (patch) | |
tree | 5c37085047a9c83555607e8811423da4dd3ed4ed /kernel/posix-cpu-timers.c | |
parent | a241ec65aeac3d69a08a7b153cccbdb7ea35063f (diff) |
[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>
Diffstat (limited to 'kernel/posix-cpu-timers.c')
-rw-r--r-- | kernel/posix-cpu-timers.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index bf374fceb39c..91a894264941 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
@@ -1225,7 +1225,7 @@ void posix_cpu_timer_schedule(struct k_itimer *timer) | |||
1225 | /* | 1225 | /* |
1226 | * The task was cleaned up already, no future firings. | 1226 | * The task was cleaned up already, no future firings. |
1227 | */ | 1227 | */ |
1228 | return; | 1228 | goto out; |
1229 | 1229 | ||
1230 | /* | 1230 | /* |
1231 | * Fetch the current sample and update the timer's expiry time. | 1231 | * Fetch the current sample and update the timer's expiry time. |
@@ -1235,7 +1235,7 @@ void posix_cpu_timer_schedule(struct k_itimer *timer) | |||
1235 | bump_cpu_timer(timer, now); | 1235 | bump_cpu_timer(timer, now); |
1236 | if (unlikely(p->exit_state)) { | 1236 | if (unlikely(p->exit_state)) { |
1237 | clear_dead_task(timer, now); | 1237 | clear_dead_task(timer, now); |
1238 | return; | 1238 | goto out; |
1239 | } | 1239 | } |
1240 | read_lock(&tasklist_lock); /* arm_timer needs it. */ | 1240 | read_lock(&tasklist_lock); /* arm_timer needs it. */ |
1241 | } else { | 1241 | } else { |
@@ -1248,8 +1248,7 @@ void posix_cpu_timer_schedule(struct k_itimer *timer) | |||
1248 | put_task_struct(p); | 1248 | put_task_struct(p); |
1249 | timer->it.cpu.task = p = NULL; | 1249 | timer->it.cpu.task = p = NULL; |
1250 | timer->it.cpu.expires.sched = 0; | 1250 | timer->it.cpu.expires.sched = 0; |
1251 | read_unlock(&tasklist_lock); | 1251 | goto out_unlock; |
1252 | return; | ||
1253 | } else if (unlikely(p->exit_state) && thread_group_empty(p)) { | 1252 | } else if (unlikely(p->exit_state) && thread_group_empty(p)) { |
1254 | /* | 1253 | /* |
1255 | * We've noticed that the thread is dead, but | 1254 | * We've noticed that the thread is dead, but |
@@ -1257,8 +1256,7 @@ void posix_cpu_timer_schedule(struct k_itimer *timer) | |||
1257 | * drop our task ref. | 1256 | * drop our task ref. |
1258 | */ | 1257 | */ |
1259 | clear_dead_task(timer, now); | 1258 | clear_dead_task(timer, now); |
1260 | read_unlock(&tasklist_lock); | 1259 | goto out_unlock; |
1261 | return; | ||
1262 | } | 1260 | } |
1263 | cpu_clock_sample_group(timer->it_clock, p, &now); | 1261 | cpu_clock_sample_group(timer->it_clock, p, &now); |
1264 | bump_cpu_timer(timer, now); | 1262 | bump_cpu_timer(timer, now); |
@@ -1270,7 +1268,13 @@ void posix_cpu_timer_schedule(struct k_itimer *timer) | |||
1270 | */ | 1268 | */ |
1271 | arm_timer(timer, now); | 1269 | arm_timer(timer, now); |
1272 | 1270 | ||
1271 | out_unlock: | ||
1273 | read_unlock(&tasklist_lock); | 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 | /* |