| From 3d05b8aebc5f10ee3ab129b61100196855dd7249 Mon Sep 17 00:00:00 2001 |
| From: Helge Deller <deller@gmx.de> |
| Date: Tue, 28 Jul 2020 18:49:45 +0200 |
| Subject: Revert "parisc: Improve interrupt handling in arch_spin_lock_flags()" |
| |
| From: Helge Deller <deller@gmx.de> |
| |
| commit 3d05b8aebc5f10ee3ab129b61100196855dd7249 upstream. |
| |
| This reverts commit 2772f0efd5bbd5413db3d22e363b779ca0fa5310. |
| It turns out that we want to implement the spinlock code differently. |
| |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Cc: <stable@vger.kernel.org> # v5.7+ |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/parisc/include/asm/spinlock.h | 25 ++++++++----------------- |
| 1 file changed, 8 insertions(+), 17 deletions(-) |
| |
| --- a/arch/parisc/include/asm/spinlock.h |
| +++ b/arch/parisc/include/asm/spinlock.h |
| @@ -10,34 +10,25 @@ |
| static inline int arch_spin_is_locked(arch_spinlock_t *x) |
| { |
| volatile unsigned int *a = __ldcw_align(x); |
| - smp_mb(); |
| return *a == 0; |
| } |
| |
| -static inline void arch_spin_lock(arch_spinlock_t *x) |
| -{ |
| - volatile unsigned int *a; |
| - |
| - a = __ldcw_align(x); |
| - while (__ldcw(a) == 0) |
| - while (*a == 0) |
| - cpu_relax(); |
| -} |
| +#define arch_spin_lock(lock) arch_spin_lock_flags(lock, 0) |
| |
| static inline void arch_spin_lock_flags(arch_spinlock_t *x, |
| unsigned long flags) |
| { |
| volatile unsigned int *a; |
| - unsigned long flags_dis; |
| |
| a = __ldcw_align(x); |
| - while (__ldcw(a) == 0) { |
| - local_save_flags(flags_dis); |
| - local_irq_restore(flags); |
| + while (__ldcw(a) == 0) |
| while (*a == 0) |
| - cpu_relax(); |
| - local_irq_restore(flags_dis); |
| - } |
| + if (flags & PSW_SM_I) { |
| + local_irq_enable(); |
| + cpu_relax(); |
| + local_irq_disable(); |
| + } else |
| + cpu_relax(); |
| } |
| #define arch_spin_lock_flags arch_spin_lock_flags |
| |