summaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-06-26 09:24:23 +0200
committerIngo Molnar <mingo@elte.hu>2008-06-26 09:24:23 +0200
commit9a13150109fb418c50fa400c012f90d0ce6f67c3 (patch)
tree237d8ee3b8b87984776b5aa0f05b92f84d372a1d /kernel/sched.c
parentrcu: make quiescent rcutorture less power-hungry (diff)
parentLinux 2.6.26-rc8 (diff)
downloadlinux-9a13150109fb418c50fa400c012f90d0ce6f67c3.tar.xz
linux-9a13150109fb418c50fa400c012f90d0ce6f67c3.zip
Merge commit 'v2.6.26-rc8' into core/rcu
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 b048ad8a11af..3aaa5c8cb421 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4398,22 +4398,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