RISC-V: Move to queued RW locks
authorPalmer Dabbelt <palmer@rivosinc.com>
Wed, 16 Mar 2022 23:11:33 +0000 (16:11 -0700)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 11 May 2022 18:50:10 +0000 (11:50 -0700)
Now that we have fair spinlocks we can use the generic queued rwlocks,
so we might as well do so.

Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/Kconfig
arch/riscv/include/asm/Kbuild
arch/riscv/include/asm/spinlock.h [deleted file]
arch/riscv/include/asm/spinlock_types.h [deleted file]

index 00fd9c5..f8a55d9 100644 (file)
@@ -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
index c3f229a..504f8b7 100644 (file)
@@ -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 (file)
index 88a4d5d..0000000
+++ /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 (file)
index f2f9b5d..0000000
+++ /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 */