diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-09-23 06:59:56 -0400 |
---|---|---|
committer | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-09-28 06:46:24 -0400 |
commit | 491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46 (patch) | |
tree | 81cb77f31a841e87cecb9329f26e6524cc44f3a2 /lib/lockref.c | |
parent | 083986e8248d978b6c961d3da6beb0c921c68220 (diff) |
lockref: use arch_mutex_cpu_relax() in CMPXCHG_LOOP()
Make use of arch_mutex_cpu_relax() so architectures can override the
default cpu_relax() semantics.
This is especially useful for s390, where cpu_relax() means that we
yield() the current (virtual) cpu and therefore is very expensive,
and would contradict the whole purpose of the lockless cmpxchg loop.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'lib/lockref.c')
-rw-r--r-- | lib/lockref.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/lockref.c b/lib/lockref.c index e294ae445c9a..6f9d434c1521 100644 --- a/lib/lockref.c +++ b/lib/lockref.c | |||
@@ -12,6 +12,14 @@ | |||
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | /* | 14 | /* |
15 | * Allow architectures to override the default cpu_relax() within CMPXCHG_LOOP. | ||
16 | * This is useful for architectures with an expensive cpu_relax(). | ||
17 | */ | ||
18 | #ifndef arch_mutex_cpu_relax | ||
19 | # define arch_mutex_cpu_relax() cpu_relax() | ||
20 | #endif | ||
21 | |||
22 | /* | ||
15 | * Note that the "cmpxchg()" reloads the "old" value for the | 23 | * Note that the "cmpxchg()" reloads the "old" value for the |
16 | * failure case. | 24 | * failure case. |
17 | */ | 25 | */ |
@@ -28,7 +36,7 @@ | |||
28 | if (likely(old.lock_count == prev.lock_count)) { \ | 36 | if (likely(old.lock_count == prev.lock_count)) { \ |
29 | SUCCESS; \ | 37 | SUCCESS; \ |
30 | } \ | 38 | } \ |
31 | cpu_relax(); \ | 39 | arch_mutex_cpu_relax(); \ |
32 | } \ | 40 | } \ |
33 | } while (0) | 41 | } while (0) |
34 | 42 | ||