diff options
author | Davidlohr Bueso <dave@stgolabs.net> | 2015-01-30 04:14:25 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-02-18 10:57:13 -0500 |
commit | 7a215f89a0335582292ec6f3edaa3abd570da75a (patch) | |
tree | e2f21b6e285b864eab87f5a13a1cbf91b2152eb4 /kernel/locking/rwsem.c | |
parent | 49e4b2bcf7b812e985e65b6c8a0255b1520a6e7e (diff) |
locking/rwsem: Set lock ownership ASAP
In order to optimize the spinning step, we need to set the lock
owner as soon as the lock is acquired; after a successful counter
cmpxchg operation, that is. This is particularly useful as rwsems
need to set the owner to nil for readers, so there is a greater
chance of falling out of the spinning. Currently we only set the
owner much later in the game, in the more generic level -- latency
can be specially bad when waiting for a node->next pointer when
releasing the osq in up_write calls.
As such, update the owner inside rwsem_try_write_lock (when the
lock is obtained after blocking) and rwsem_try_write_lock_unqueued
(when the lock is obtained while spinning). This requires creating
a new internal rwsem.h header to share the owner related calls.
Also cleanup some headers for mutex and rwsem.
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Jason Low <jason.low2@hp.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michel Lespinasse <walken@google.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Link: http://lkml.kernel.org/r/1422609267-15102-4-git-send-email-dave@stgolabs.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/locking/rwsem.c')
-rw-r--r-- | kernel/locking/rwsem.c | 22 |
1 files changed, 1 insertions, 21 deletions
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index e2d3bc7f03b4..205be0ce34de 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c | |||
@@ -9,29 +9,9 @@ | |||
9 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
10 | #include <linux/export.h> | 10 | #include <linux/export.h> |
11 | #include <linux/rwsem.h> | 11 | #include <linux/rwsem.h> |
12 | |||
13 | #include <linux/atomic.h> | 12 | #include <linux/atomic.h> |
14 | 13 | ||
15 | #ifdef CONFIG_RWSEM_SPIN_ON_OWNER | 14 | #include "rwsem.h" |
16 | static inline void rwsem_set_owner(struct rw_semaphore *sem) | ||
17 | { | ||
18 | sem->owner = current; | ||
19 | } | ||
20 | |||
21 | static inline void rwsem_clear_owner(struct rw_semaphore *sem) | ||
22 | { | ||
23 | sem->owner = NULL; | ||
24 | } | ||
25 | |||
26 | #else | ||
27 | static inline void rwsem_set_owner(struct rw_semaphore *sem) | ||
28 | { | ||
29 | } | ||
30 | |||
31 | static inline void rwsem_clear_owner(struct rw_semaphore *sem) | ||
32 | { | ||
33 | } | ||
34 | #endif | ||
35 | 15 | ||
36 | /* | 16 | /* |
37 | * lock for reading | 17 | * lock for reading |