aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/completion.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/completion.c')
-rw-r--r--kernel/sched/completion.c10
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;