csky: Move to generic ticket-spinlock
authorGuo Ren <guoren@linux.alibaba.com>
Fri, 18 Mar 2022 08:34:21 +0000 (16:34 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 11 May 2022 18:50:15 +0000 (11:50 -0700)
There is no benefit from custom implementation for ticket-spinlock,
so move to generic ticket-spinlock for easy maintenance.

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

index 8882482..103207a 100644 (file)
@@ -3,7 +3,10 @@ generic-y += asm-offsets.h
 generic-y += extable.h
 generic-y += gpio.h
 generic-y += kvm_para.h
+generic-y += spinlock.h
+generic-y += spinlock_types.h
 generic-y += qrwlock.h
+generic-y += qrwlock_types.h
 generic-y += parport.h
 generic-y += user.h
 generic-y += vmlinux.lds.h
diff --git a/arch/csky/include/asm/spinlock.h b/arch/csky/include/asm/spinlock.h
deleted file mode 100644 (file)
index 69f5aa2..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-#ifndef __ASM_CSKY_SPINLOCK_H
-#define __ASM_CSKY_SPINLOCK_H
-
-#include <linux/spinlock_types.h>
-#include <asm/barrier.h>
-
-/*
- * Ticket-based spin-locking.
- */
-static inline void arch_spin_lock(arch_spinlock_t *lock)
-{
-       arch_spinlock_t lockval;
-       u32 ticket_next = 1 << TICKET_NEXT;
-       u32 *p = &lock->lock;
-       u32 tmp;
-
-       asm volatile (
-               "1:     ldex.w          %0, (%2) \n"
-               "       mov             %1, %0   \n"
-               "       add             %0, %3   \n"
-               "       stex.w          %0, (%2) \n"
-               "       bez             %0, 1b   \n"
-               : "=&r" (tmp), "=&r" (lockval)
-               : "r"(p), "r"(ticket_next)
-               : "cc");
-
-       while (lockval.tickets.next != lockval.tickets.owner)
-               lockval.tickets.owner = READ_ONCE(lock->tickets.owner);
-
-       smp_mb();
-}
-
-static inline int arch_spin_trylock(arch_spinlock_t *lock)
-{
-       u32 tmp, contended, res;
-       u32 ticket_next = 1 << TICKET_NEXT;
-       u32 *p = &lock->lock;
-
-       do {
-               asm volatile (
-               "       ldex.w          %0, (%3)   \n"
-               "       movi            %2, 1      \n"
-               "       rotli           %1, %0, 16 \n"
-               "       cmpne           %1, %0     \n"
-               "       bt              1f         \n"
-               "       movi            %2, 0      \n"
-               "       add             %0, %0, %4 \n"
-               "       stex.w          %0, (%3)   \n"
-               "1:                                \n"
-               : "=&r" (res), "=&r" (tmp), "=&r" (contended)
-               : "r"(p), "r"(ticket_next)
-               : "cc");
-       } while (!res);
-
-       if (!contended)
-               smp_mb();
-
-       return !contended;
-}
-
-static inline void arch_spin_unlock(arch_spinlock_t *lock)
-{
-       smp_mb();
-       WRITE_ONCE(lock->tickets.owner, lock->tickets.owner + 1);
-}
-
-static inline int arch_spin_value_unlocked(arch_spinlock_t lock)
-{
-       return lock.tickets.owner == lock.tickets.next;
-}
-
-static inline int arch_spin_is_locked(arch_spinlock_t *lock)
-{
-       return !arch_spin_value_unlocked(READ_ONCE(*lock));
-}
-
-static inline int arch_spin_is_contended(arch_spinlock_t *lock)
-{
-       struct __raw_tickets tickets = READ_ONCE(lock->tickets);
-
-       return (tickets.next - tickets.owner) > 1;
-}
-#define arch_spin_is_contended arch_spin_is_contended
-
-#include <asm/qrwlock.h>
-
-#endif /* __ASM_CSKY_SPINLOCK_H */
diff --git a/arch/csky/include/asm/spinlock_types.h b/arch/csky/include/asm/spinlock_types.h
deleted file mode 100644 (file)
index db87a12..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-#ifndef __ASM_CSKY_SPINLOCK_TYPES_H
-#define __ASM_CSKY_SPINLOCK_TYPES_H
-
-#ifndef __LINUX_SPINLOCK_TYPES_RAW_H
-# error "please don't include this file directly"
-#endif
-
-#define TICKET_NEXT    16
-
-typedef struct {
-       union {
-               u32 lock;
-               struct __raw_tickets {
-                       /* little endian */
-                       u16 owner;
-                       u16 next;
-               } tickets;
-       };
-} arch_spinlock_t;
-
-#define __ARCH_SPIN_LOCK_UNLOCKED      { { 0 } }
-
-#include <asm-generic/qrwlock_types.h>
-
-#endif /* __ASM_CSKY_SPINLOCK_TYPES_H */