Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6541d98d authored by John David Anglin's avatar John David Anglin Committed by Greg Kroah-Hartman
Browse files

parisc: Remove unnecessary barriers from spinlock.h



commit 3b885ac1 upstream.

Now that mb() is an instruction barrier, it will slow performance if we issue
unnecessary barriers.

The spinlock defines have a number of unnecessary barriers.  The __ldcw()
define is both a hardware and compiler barrier.  The mb() barriers in the
routines using __ldcw() serve no purpose.

The only barrier needed is the one in arch_spin_unlock().  We need to ensure
all accesses are complete prior to releasing the lock.

Signed-off-by: default avatarJohn David Anglin <dave.anglin@bell.net>
Cc: stable@vger.kernel.org # 4.0+
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3f59cf41
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *x,
{
	volatile unsigned int *a;

	mb();
	a = __ldcw_align(x);
	while (__ldcw(a) == 0)
		while (*a == 0)
@@ -30,16 +29,15 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *x,
				local_irq_disable();
			} else
				cpu_relax();
	mb();
}

static inline void arch_spin_unlock(arch_spinlock_t *x)
{
	volatile unsigned int *a;
	mb();

	a = __ldcw_align(x);
	*a = 1;
	mb();
	*a = 1;
}

static inline int arch_spin_trylock(arch_spinlock_t *x)
@@ -47,10 +45,8 @@ static inline int arch_spin_trylock(arch_spinlock_t *x)
	volatile unsigned int *a;
	int ret;

	mb();
	a = __ldcw_align(x);
        ret = __ldcw(a) != 0;
	mb();

	return ret;
}