On 30/04/2022 16:36, Palmer Dabbelt wrote: > From: Palmer Dabbelt <palmer@xxxxxxxxxxxx> > > Now that we have fair spinlocks we can use the generic queued rwlocks, > so we might as well do so. > > Signed-off-by: Palmer Dabbelt <palmer@xxxxxxxxxxxx> Verbatim from the other patch: I am loathe to add a TB tag since I have not done much by way of testing any realistic use cases - but I have put it in our CI and have had a play around with it locally & nothing obviously broke for me. If you think that is sufficient: Tested-by: Conor Dooley <conor.dooley@xxxxxxxxxxxxx> Otherwise feel free to ignore the tag. Thanks, Conor. > --- > arch/riscv/Kconfig | 1 + > arch/riscv/include/asm/Kbuild | 2 + > arch/riscv/include/asm/spinlock.h | 99 ------------------------- > arch/riscv/include/asm/spinlock_types.h | 24 ------ > 4 files changed, 3 insertions(+), 123 deletions(-) > delete mode 100644 arch/riscv/include/asm/spinlock.h > delete mode 100644 arch/riscv/include/asm/spinlock_types.h > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > index 00fd9c548f26..f8a55d94016d 100644 > --- a/arch/riscv/Kconfig > +++ b/arch/riscv/Kconfig > @@ -39,6 +39,7 @@ config RISCV > select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU > select ARCH_SUPPORTS_HUGETLBFS if MMU > select ARCH_USE_MEMTEST > + select ARCH_USE_QUEUED_RWLOCKS > select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU > select ARCH_WANT_FRAME_POINTERS > select ARCH_WANT_GENERAL_HUGETLB > diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild > index c3f229ae8033..504f8b7e72d4 100644 > --- a/arch/riscv/include/asm/Kbuild > +++ b/arch/riscv/include/asm/Kbuild > @@ -3,6 +3,8 @@ generic-y += early_ioremap.h > generic-y += flat.h > generic-y += kvm_para.h > generic-y += parport.h > +generic-y += spinlock.h > +generic-y += spinlock_types.h > generic-y += qrwlock.h > generic-y += qrwlock_types.h > generic-y += user.h > diff --git a/arch/riscv/include/asm/spinlock.h b/arch/riscv/include/asm/spinlock.h > deleted file mode 100644 > index 88a4d5d0d98a..000000000000 > --- a/arch/riscv/include/asm/spinlock.h > +++ /dev/null > @@ -1,99 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-only */ > -/* > - * Copyright (C) 2015 Regents of the University of California > - * Copyright (C) 2017 SiFive > - */ > - > -#ifndef _ASM_RISCV_SPINLOCK_H > -#define _ASM_RISCV_SPINLOCK_H > - > -/* This is horible, but the whole file is going away in the next commit. */ > -#define __ASM_GENERIC_QRWLOCK_H > - > -#include <linux/kernel.h> > -#include <asm/current.h> > -#include <asm/fence.h> > -#include <asm-generic/spinlock.h> > - > -static inline void arch_read_lock(arch_rwlock_t *lock) > -{ > - int tmp; > - > - __asm__ __volatile__( > - "1: lr.w %1, %0\n" > - " bltz %1, 1b\n" > - " addi %1, %1, 1\n" > - " sc.w %1, %1, %0\n" > - " bnez %1, 1b\n" > - RISCV_ACQUIRE_BARRIER > - : "+A" (lock->lock), "=&r" (tmp) > - :: "memory"); > -} > - > -static inline void arch_write_lock(arch_rwlock_t *lock) > -{ > - int tmp; > - > - __asm__ __volatile__( > - "1: lr.w %1, %0\n" > - " bnez %1, 1b\n" > - " li %1, -1\n" > - " sc.w %1, %1, %0\n" > - " bnez %1, 1b\n" > - RISCV_ACQUIRE_BARRIER > - : "+A" (lock->lock), "=&r" (tmp) > - :: "memory"); > -} > - > -static inline int arch_read_trylock(arch_rwlock_t *lock) > -{ > - int busy; > - > - __asm__ __volatile__( > - "1: lr.w %1, %0\n" > - " bltz %1, 1f\n" > - " addi %1, %1, 1\n" > - " sc.w %1, %1, %0\n" > - " bnez %1, 1b\n" > - RISCV_ACQUIRE_BARRIER > - "1:\n" > - : "+A" (lock->lock), "=&r" (busy) > - :: "memory"); > - > - return !busy; > -} > - > -static inline int arch_write_trylock(arch_rwlock_t *lock) > -{ > - int busy; > - > - __asm__ __volatile__( > - "1: lr.w %1, %0\n" > - " bnez %1, 1f\n" > - " li %1, -1\n" > - " sc.w %1, %1, %0\n" > - " bnez %1, 1b\n" > - RISCV_ACQUIRE_BARRIER > - "1:\n" > - : "+A" (lock->lock), "=&r" (busy) > - :: "memory"); > - > - return !busy; > -} > - > -static inline void arch_read_unlock(arch_rwlock_t *lock) > -{ > - __asm__ __volatile__( > - RISCV_RELEASE_BARRIER > - " amoadd.w x0, %1, %0\n" > - : "+A" (lock->lock) > - : "r" (-1) > - : "memory"); > -} > - > -static inline void arch_write_unlock(arch_rwlock_t *lock) > -{ > - smp_store_release(&lock->lock, 0); > -} > - > -#endif /* _ASM_RISCV_SPINLOCK_H */ > diff --git a/arch/riscv/include/asm/spinlock_types.h b/arch/riscv/include/asm/spinlock_types.h > deleted file mode 100644 > index f2f9b5d7120d..000000000000 > --- a/arch/riscv/include/asm/spinlock_types.h > +++ /dev/null > @@ -1,24 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-only */ > -/* > - * Copyright (C) 2015 Regents of the University of California > - */ > - > -#ifndef _ASM_RISCV_SPINLOCK_TYPES_H > -#define _ASM_RISCV_SPINLOCK_TYPES_H > - > -/* This is horible, but the whole file is going away in the next commit. */ > -#define __ASM_GENERIC_QRWLOCK_TYPES_H > - > -#ifndef __LINUX_SPINLOCK_TYPES_RAW_H > -# error "please don't include this file directly" > -#endif > - > -#include <asm-generic/spinlock_types.h> > - > -typedef struct { > - volatile unsigned int lock; > -} arch_rwlock_t; > - > -#define __ARCH_RW_LOCK_UNLOCKED { 0 } > - > -#endif /* _ASM_RISCV_SPINLOCK_TYPES_H */