diff options
| author | Mike Waychison <michael.waychison@sun.com> | 2005-02-01 16:31:15 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-02-01 16:31:15 -0800 |
| commit | fc8691bf721f8df02142cee027f2ba553da471e2 (patch) | |
| tree | df3f039cdded42c5b0ddd747871f42d8e0130e8b /kernel | |
| parent | 7340ad67c3522b37a3e411a08e4aa370a8163aec (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.c | 21 |
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); |
