diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-09-23 12:59:56 +0200 |
---|---|---|
committer | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-09-28 12:46:24 +0200 |
commit | 491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46 (patch) | |
tree | 81cb77f31a841e87cecb9329f26e6524cc44f3a2 | |
parent | 083986e8248d978b6c961d3da6beb0c921c68220 (diff) | |
download | lwn-491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46.tar.gz lwn-491f6f8e5fd9a57aaf03b6d6e3e153f1c27d8a46.zip |
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>
-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 @@ #endif /* + * Allow architectures to override the default cpu_relax() within CMPXCHG_LOOP. + * This is useful for architectures with an expensive cpu_relax(). + */ +#ifndef arch_mutex_cpu_relax +# define arch_mutex_cpu_relax() cpu_relax() +#endif + +/* * Note that the "cmpxchg()" reloads the "old" value for the * failure case. */ @@ -28,7 +36,7 @@ if (likely(old.lock_count == prev.lock_count)) { \ SUCCESS; \ } \ - cpu_relax(); \ + arch_mutex_cpu_relax(); \ } \ } while (0) |