* [PATCH RFC] sched: completion: lock-free checking of the blocking case
@ 2015-01-23 11:41 Nicholas Mc Guire
2015-02-04 14:38 ` [tip:locking/core] sched/completion: Add " tip-bot for Nicholas Mc Guire
0 siblings, 1 reply; 2+ messages in thread
From: Nicholas Mc Guire @ 2015-01-23 11:41 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Peter Zijlstra, linux-kernel, Nicholas Mc Guire
The "thread would block" case can be checked without grabbing the lock
Signed-off-by: Nicholas Mc Guire <der.herr@hofr.at>
---
If the check does not return early then grab the lock and recheck.
A memory barrier is not needed as complete() and complete_all() imply
a barrier.
The ACCESS_ONCE is needed for calls in a loop that, if inlined, could
optimize out the re-fetching of x->done.
kernel/sched/completion.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/kernel/sched/completion.c b/kernel/sched/completion.c
index 7c5cd70..5f7cf31 100644
--- a/kernel/sched/completion.c
+++ b/kernel/sched/completion.c
@@ -268,6 +268,15 @@ bool try_wait_for_completion(struct completion *x)
unsigned long flags;
int ret = 1;
+ /*
+ * Since x->done will need to be locked only
+ * in the non-blocking case, we check x->done
+ * first without taking the lock so we can
+ * return early in the blocking case.
+ */
+ if (!ACCESS_ONCE(x->done))
+ return 0;
+
spin_lock_irqsave(&x->wait.lock, flags);
if (!x->done)
ret = 0;
--
1.7.10.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [tip:locking/core] sched/completion: Add lock-free checking of the blocking case
2015-01-23 11:41 [PATCH RFC] sched: completion: lock-free checking of the blocking case Nicholas Mc Guire
@ 2015-02-04 14:38 ` tip-bot for Nicholas Mc Guire
0 siblings, 0 replies; 2+ messages in thread
From: tip-bot for Nicholas Mc Guire @ 2015-02-04 14:38 UTC (permalink / raw)
To: linux-tip-commits
Cc: der.herr, peterz, hpa, tglx, mingo, torvalds, linux-kernel
Commit-ID: 7c34e3180a01c800a40bc8535654d5735802fc1b
Gitweb: http://git.kernel.org/tip/7c34e3180a01c800a40bc8535654d5735802fc1b
Author: Nicholas Mc Guire <der.herr@hofr.at>
AuthorDate: Fri, 23 Jan 2015 12:41:47 +0100
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 4 Feb 2015 07:57:37 +0100
sched/completion: Add lock-free checking of the blocking case
The "thread would block" case can be checked without grabbing ->wait.lock.
[ If the check does not return early then grab the lock and recheck.
A memory barrier is not needed as complete() and complete_all() imply
a barrier.
The ACCESS_ONCE() is needed for calls in a loop that, if inlined, could
optimize out the re-fetching of x->done. ]
Signed-off-by: Nicholas Mc Guire <der.herr@hofr.at>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/1422013307-13200-1-git-send-email-der.herr@hofr.at
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/sched/completion.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/kernel/sched/completion.c b/kernel/sched/completion.c
index 9d1fe32d..7052d3f 100644
--- a/kernel/sched/completion.c
+++ b/kernel/sched/completion.c
@@ -268,6 +268,15 @@ bool try_wait_for_completion(struct completion *x)
unsigned long flags;
int ret = 1;
+ /*
+ * Since x->done will need to be locked only
+ * in the non-blocking case, we check x->done
+ * first without taking the lock so we can
+ * return early in the blocking case.
+ */
+ if (!ACCESS_ONCE(x->done))
+ return 0;
+
spin_lock_irqsave(&x->wait.lock, flags);
if (!x->done)
ret = 0;
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-02-04 14:38 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-23 11:41 [PATCH RFC] sched: completion: lock-free checking of the blocking case Nicholas Mc Guire
2015-02-04 14:38 ` [tip:locking/core] sched/completion: Add " tip-bot for Nicholas Mc Guire
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.