diff options
Diffstat (limited to 'kernel/sched/completion.c')
-rw-r--r-- | kernel/sched/completion.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/sched/completion.c b/kernel/sched/completion.c index 8d0f35debf35..f063a25d4449 100644 --- a/kernel/sched/completion.c +++ b/kernel/sched/completion.c | |||
@@ -31,7 +31,8 @@ void complete(struct completion *x) | |||
31 | unsigned long flags; | 31 | unsigned long flags; |
32 | 32 | ||
33 | spin_lock_irqsave(&x->wait.lock, flags); | 33 | spin_lock_irqsave(&x->wait.lock, flags); |
34 | x->done++; | 34 | if (x->done != UINT_MAX) |
35 | x->done++; | ||
35 | __wake_up_locked(&x->wait, TASK_NORMAL, 1); | 36 | __wake_up_locked(&x->wait, TASK_NORMAL, 1); |
36 | spin_unlock_irqrestore(&x->wait.lock, flags); | 37 | spin_unlock_irqrestore(&x->wait.lock, flags); |
37 | } | 38 | } |
@@ -51,7 +52,7 @@ void complete_all(struct completion *x) | |||
51 | unsigned long flags; | 52 | unsigned long flags; |
52 | 53 | ||
53 | spin_lock_irqsave(&x->wait.lock, flags); | 54 | spin_lock_irqsave(&x->wait.lock, flags); |
54 | x->done += UINT_MAX/2; | 55 | x->done = UINT_MAX; |
55 | __wake_up_locked(&x->wait, TASK_NORMAL, 0); | 56 | __wake_up_locked(&x->wait, TASK_NORMAL, 0); |
56 | spin_unlock_irqrestore(&x->wait.lock, flags); | 57 | spin_unlock_irqrestore(&x->wait.lock, flags); |
57 | } | 58 | } |
@@ -79,7 +80,8 @@ do_wait_for_common(struct completion *x, | |||
79 | if (!x->done) | 80 | if (!x->done) |
80 | return timeout; | 81 | return timeout; |
81 | } | 82 | } |
82 | x->done--; | 83 | if (x->done != UINT_MAX) |
84 | x->done--; | ||
83 | return timeout ?: 1; | 85 | return timeout ?: 1; |
84 | } | 86 | } |
85 | 87 | ||
@@ -280,7 +282,7 @@ bool try_wait_for_completion(struct completion *x) | |||
280 | spin_lock_irqsave(&x->wait.lock, flags); | 282 | spin_lock_irqsave(&x->wait.lock, flags); |
281 | if (!x->done) | 283 | if (!x->done) |
282 | ret = 0; | 284 | ret = 0; |
283 | else | 285 | else if (x->done != UINT_MAX) |
284 | x->done--; | 286 | x->done--; |
285 | spin_unlock_irqrestore(&x->wait.lock, flags); | 287 | spin_unlock_irqrestore(&x->wait.lock, flags); |
286 | return ret; | 288 | return ret; |