mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-04 08:08:54 +00:00
parisc: Improve interrupt handling in arch_spin_lock_flags()
Rewrite arch_spin_lock() and arch_spin_lock_flags() to not re-enable and disable the PSW_SM_I interrupt flag too often. Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
997ba65736
commit
2772f0efd5
1 changed files with 19 additions and 10 deletions
|
@ -10,25 +10,34 @@
|
||||||
static inline int arch_spin_is_locked(arch_spinlock_t *x)
|
static inline int arch_spin_is_locked(arch_spinlock_t *x)
|
||||||
{
|
{
|
||||||
volatile unsigned int *a = __ldcw_align(x);
|
volatile unsigned int *a = __ldcw_align(x);
|
||||||
|
smp_mb();
|
||||||
return *a == 0;
|
return *a == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define arch_spin_lock(lock) arch_spin_lock_flags(lock, 0)
|
static inline void arch_spin_lock(arch_spinlock_t *x)
|
||||||
|
|
||||||
static inline void arch_spin_lock_flags(arch_spinlock_t *x,
|
|
||||||
unsigned long flags)
|
|
||||||
{
|
{
|
||||||
volatile unsigned int *a;
|
volatile unsigned int *a;
|
||||||
|
|
||||||
a = __ldcw_align(x);
|
a = __ldcw_align(x);
|
||||||
while (__ldcw(a) == 0)
|
while (__ldcw(a) == 0)
|
||||||
while (*a == 0)
|
while (*a == 0)
|
||||||
if (flags & PSW_SM_I) {
|
cpu_relax();
|
||||||
local_irq_enable();
|
}
|
||||||
cpu_relax();
|
|
||||||
local_irq_disable();
|
static inline void arch_spin_lock_flags(arch_spinlock_t *x,
|
||||||
} else
|
unsigned long flags)
|
||||||
cpu_relax();
|
{
|
||||||
|
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 (*a == 0)
|
||||||
|
cpu_relax();
|
||||||
|
local_irq_restore(flags_dis);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#define arch_spin_lock_flags arch_spin_lock_flags
|
#define arch_spin_lock_flags arch_spin_lock_flags
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue