Enable queued rwlocks for SPARC. Here are the discussions on this feature when this was introduced. https://lwn.net/Articles/572765/ https://lwn.net/Articles/582200/ Signed-off-by: Babu Moger <babu.moger@xxxxxxxxxx> Reviewed-by: Håkon Bugge <haakon.bugge@xxxxxxxxxx> Reviewed-by: Jane Chu <jane.chu@xxxxxxxxxx> Reviewed-by: Shannon Nelson <shannon.nelson@xxxxxxxxxx> Reviewed-by: Vijay Kumar <vijay.ac.kumar@xxxxxxxxxx> --- arch/sparc/Kconfig | 1 + arch/sparc/include/asm/qrwlock.h | 7 +++++++ arch/sparc/include/asm/spinlock_64.h | 9 ++++++--- arch/sparc/include/asm/spinlock_types.h | 5 ++++- 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 arch/sparc/include/asm/qrwlock.h diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 8787fc4..caeda1c 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -82,6 +82,7 @@ config SPARC64 select HAVE_ARCH_AUDITSYSCALL select ARCH_SUPPORTS_ATOMIC_RMW select HAVE_NMI + select ARCH_USE_QUEUED_RWLOCKS config ARCH_DEFCONFIG string diff --git a/arch/sparc/include/asm/qrwlock.h b/arch/sparc/include/asm/qrwlock.h new file mode 100644 index 0000000..d68a4b1 --- /dev/null +++ b/arch/sparc/include/asm/qrwlock.h @@ -0,0 +1,7 @@ +#ifndef _ASM_SPARC_QRWLOCK_H +#define _ASM_SPARC_QRWLOCK_H + +#include <asm-generic/qrwlock_types.h> +#include <asm-generic/qrwlock.h> + +#endif /* _ASM_SPARC_QRWLOCK_H */ diff --git a/arch/sparc/include/asm/spinlock_64.h b/arch/sparc/include/asm/spinlock_64.h index 07c9f2e..562dbd8 100644 --- a/arch/sparc/include/asm/spinlock_64.h +++ b/arch/sparc/include/asm/spinlock_64.h @@ -94,6 +94,7 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long fla : "memory"); } +#ifndef CONFIG_QUEUED_RWLOCKS /* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */ static inline void arch_read_lock(arch_rwlock_t *lock) @@ -214,12 +215,14 @@ static inline int arch_write_trylock(arch_rwlock_t *lock) return result; } -#define arch_read_lock_flags(p, f) arch_read_lock(p) -#define arch_write_lock_flags(p, f) arch_write_lock(p) - #define arch_read_can_lock(rw) (!((rw)->lock & 0x80000000UL)) #define arch_write_can_lock(rw) (!(rw)->lock) +#endif /* #ifndef CONFIG_QUEUED_RWLOCKS */ +#include <asm/qrwlock.h> +#define arch_read_lock_flags(p, f) arch_read_lock(p) +#define arch_write_lock_flags(p, f) arch_write_lock(p) + #define arch_spin_relax(lock) cpu_relax() #define arch_read_relax(lock) cpu_relax() #define arch_write_relax(lock) cpu_relax() diff --git a/arch/sparc/include/asm/spinlock_types.h b/arch/sparc/include/asm/spinlock_types.h index 9c454fd..e052d28 100644 --- a/arch/sparc/include/asm/spinlock_types.h +++ b/arch/sparc/include/asm/spinlock_types.h @@ -11,10 +11,13 @@ #define __ARCH_SPIN_LOCK_UNLOCKED { 0 } +#ifdef CONFIG_QUEUED_RWLOCKS +#include <asm-generic/qrwlock_types.h> +#else typedef struct { volatile unsigned int lock; } arch_rwlock_t; #define __ARCH_RW_LOCK_UNLOCKED { 0 } - +#endif /* CONFIG_QUEUED_RWLOCKS */ #endif -- 1.7.1