diff options
| author | Oleg Nesterov <oleg@tv-sign.ru> | 2008-06-20 10:32:20 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-06-20 11:15:49 -0400 |
| commit | ea71a546706dfdad72462624394e1e472c6bf34f (patch) | |
| tree | eb6f257c73510deee995f330947de4624e9b404b | |
| parent | bb10ed0994927d433f6dbdf274fdb26cfcf516b7 (diff) | |
sched: refactor wait_for_completion_timeout()
Simplify the code and fix the boundary condition of
wait_for_completion_timeout(,0).
We can kill the first __remove_wait_queue() as well.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
| -rw-r--r-- | kernel/sched.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 577f160131bd..bebf9788f45e 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -4398,32 +4398,20 @@ do_wait_for_common(struct completion *x, long timeout, int state) | |||
| 4398 | signal_pending(current)) || | 4398 | signal_pending(current)) || |
| 4399 | (state == TASK_KILLABLE && | 4399 | (state == TASK_KILLABLE && |
| 4400 | fatal_signal_pending(current))) { | 4400 | fatal_signal_pending(current))) { |
| 4401 | __remove_wait_queue(&x->wait, &wait); | 4401 | timeout = -ERESTARTSYS; |
| 4402 | return -ERESTARTSYS; | 4402 | break; |
| 4403 | } | 4403 | } |
| 4404 | __set_current_state(state); | 4404 | __set_current_state(state); |
| 4405 | spin_unlock_irq(&x->wait.lock); | 4405 | spin_unlock_irq(&x->wait.lock); |
| 4406 | timeout = schedule_timeout(timeout); | 4406 | timeout = schedule_timeout(timeout); |
| 4407 | spin_lock_irq(&x->wait.lock); | 4407 | spin_lock_irq(&x->wait.lock); |
| 4408 | 4408 | } while (!x->done && timeout); | |
| 4409 | /* | ||
| 4410 | * If the completion has arrived meanwhile | ||
| 4411 | * then return 1 jiffy time left: | ||
| 4412 | */ | ||
| 4413 | if (x->done && !timeout) { | ||
| 4414 | timeout = 1; | ||
| 4415 | break; | ||
| 4416 | } | ||
| 4417 | |||
| 4418 | if (!timeout) { | ||
| 4419 | __remove_wait_queue(&x->wait, &wait); | ||
| 4420 | return timeout; | ||
| 4421 | } | ||
| 4422 | } while (!x->done); | ||
| 4423 | __remove_wait_queue(&x->wait, &wait); | 4409 | __remove_wait_queue(&x->wait, &wait); |
| 4410 | if (!x->done) | ||
| 4411 | return timeout; | ||
| 4424 | } | 4412 | } |
| 4425 | x->done--; | 4413 | x->done--; |
| 4426 | return timeout; | 4414 | return timeout ?: 1; |
| 4427 | } | 4415 | } |
| 4428 | 4416 | ||
| 4429 | static long __sched | 4417 | static long __sched |
