summaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-06-25 12:26:59 +0200
committerIngo Molnar <mingo@elte.hu>2008-06-25 12:26:59 +0200
commitf57aec5a871907427060196f6bac3d0011b38450 (patch)
treefec11fec6cf8e2454e07bd04ac137cad85075611 /kernel/sched.c
parent1de8644cc7c826e0c41e52825bd5a12e2e31e6ca (diff)
parent543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff)
downloadlinux-f57aec5a871907427060196f6bac3d0011b38450.tar.bz2
Merge branch 'linus' into sched/devel
Conflicts: kernel/sched_rt.c Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index adb2d01fccc2..c51d9fae8cd8 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4403,22 +4403,20 @@ do_wait_for_common(struct completion *x, long timeout, int state)
signal_pending(current)) ||
(state == TASK_KILLABLE &&
fatal_signal_pending(current))) {
- __remove_wait_queue(&x->wait, &wait);
- return -ERESTARTSYS;
+ timeout = -ERESTARTSYS;
+ break;
}
__set_current_state(state);
spin_unlock_irq(&x->wait.lock);
timeout = schedule_timeout(timeout);
spin_lock_irq(&x->wait.lock);
- if (!timeout) {
- __remove_wait_queue(&x->wait, &wait);
- return timeout;
- }
- } while (!x->done);
+ } while (!x->done && timeout);
__remove_wait_queue(&x->wait, &wait);
+ if (!x->done)
+ return timeout;
}
x->done--;
- return timeout;
+ return timeout ?: 1;
}
static long __sched