summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMike Waychison <michael.waychison@sun.com>2005-02-01 16:31:15 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-02-01 16:31:15 -0800
commitfc8691bf721f8df02142cee027f2ba553da471e2 (patch)
treedf3f039cdded42c5b0ddd747871f42d8e0130e8b /kernel
parent7340ad67c3522b37a3e411a08e4aa370a8163aec (diff)
[PATCH] wait_for_completion API extension addition fixes
Fix up signal_pending and timeout paths for wait_for_completion API extensions. Signed-off-by: Mike Waychison <michael.waychison@sun.com> Acked-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 997bd0679f04..f8d9af57ca36 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -3020,15 +3020,17 @@ wait_for_completion_timeout(struct completion *x, unsigned long timeout)
__set_current_state(TASK_UNINTERRUPTIBLE);
spin_unlock_irq(&x->wait.lock);
timeout = schedule_timeout(timeout);
- if (!timeout)
- goto out;
spin_lock_irq(&x->wait.lock);
+ if (!timeout) {
+ __remove_wait_queue(&x->wait, &wait);
+ goto out;
+ }
} while (!x->done);
__remove_wait_queue(&x->wait, &wait);
}
x->done--;
- spin_unlock_irq(&x->wait.lock);
out:
+ spin_unlock_irq(&x->wait.lock);
return timeout;
}
EXPORT_SYMBOL(wait_for_completion_timeout);
@@ -3048,6 +3050,7 @@ int fastcall __sched wait_for_completion_interruptible(struct completion *x)
do {
if (signal_pending(current)) {
ret = -ERESTARTSYS;
+ __remove_wait_queue(&x->wait, &wait);
goto out;
}
__set_current_state(TASK_INTERRUPTIBLE);
@@ -3080,21 +3083,23 @@ wait_for_completion_interruptible_timeout(struct completion *x,
do {
if (signal_pending(current)) {
timeout = -ERESTARTSYS;
- goto out_unlock;
+ __remove_wait_queue(&x->wait, &wait);
+ goto out;
}
__set_current_state(TASK_INTERRUPTIBLE);
spin_unlock_irq(&x->wait.lock);
timeout = schedule_timeout(timeout);
- if (!timeout)
- goto out;
spin_lock_irq(&x->wait.lock);
+ if (!timeout) {
+ __remove_wait_queue(&x->wait, &wait);
+ goto out;
+ }
} while (!x->done);
__remove_wait_queue(&x->wait, &wait);
}
x->done--;
-out_unlock:
- spin_unlock_irq(&x->wait.lock);
out:
+ spin_unlock_irq(&x->wait.lock);
return timeout;
}
EXPORT_SYMBOL(wait_for_completion_interruptible_timeout);