@ -32,23 +32,22 @@ static int __init spin_retry_setup(char *str)
}
__setup ( " spin_retry= " , spin_retry_setup ) ;
static inline void _raw_ compare_and_delay( unsigned int * lock , unsigned int old )
static inline void compare_and_delay ( int * lock , int old )
{
asm ( " .insn rsy,0xeb0000000022,%0,0,%1 " : : " d " ( old ) , " Q " ( * lock ) ) ;
}
void arch_spin_lock_wait ( arch_spinlock_t * lp )
{
unsigned int cpu = SPINLOCK_LOCKVAL ;
unsigned int owner ;
int count , first_diag ;
int cpu = SPINLOCK_LOCKVAL ;
int owner , count , first_diag ;
first_diag = 1 ;
while ( 1 ) {
owner = ACCESS_ONCE ( lp - > lock ) ;
/* Try to get the lock if it is free. */
if ( ! owner ) {
if ( _raw_compare_and_swap ( & lp - > lock , 0 , cpu ) )
if ( __atomic_cmpxchg_bool ( & lp - > lock , 0 , cpu ) )
return ;
continue ;
}
@ -62,7 +61,7 @@ void arch_spin_lock_wait(arch_spinlock_t *lp)
count = spin_retry ;
do {
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & lp - > lock , owner ) ;
compare_and_delay ( & lp - > lock , owner ) ;
owner = ACCESS_ONCE ( lp - > lock ) ;
} while ( owner & & count - - > 0 ) ;
if ( ! owner )
@ -82,9 +81,8 @@ EXPORT_SYMBOL(arch_spin_lock_wait);
void arch_spin_lock_wait_flags ( arch_spinlock_t * lp , unsigned long flags )
{
unsigned int cpu = SPINLOCK_LOCKVAL ;
unsigned int owner ;
int count , first_diag ;
int cpu = SPINLOCK_LOCKVAL ;
int owner , count , first_diag ;
local_irq_restore ( flags ) ;
first_diag = 1 ;
@ -93,7 +91,7 @@ void arch_spin_lock_wait_flags(arch_spinlock_t *lp, unsigned long flags)
/* Try to get the lock if it is free. */
if ( ! owner ) {
local_irq_disable ( ) ;
if ( _raw_compare_and_swap ( & lp - > lock , 0 , cpu ) )
if ( __atomic_cmpxchg_bool ( & lp - > lock , 0 , cpu ) )
return ;
local_irq_restore ( flags ) ;
continue ;
@ -108,7 +106,7 @@ void arch_spin_lock_wait_flags(arch_spinlock_t *lp, unsigned long flags)
count = spin_retry ;
do {
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & lp - > lock , owner ) ;
compare_and_delay ( & lp - > lock , owner ) ;
owner = ACCESS_ONCE ( lp - > lock ) ;
} while ( owner & & count - - > 0 ) ;
if ( ! owner )
@ -128,18 +126,17 @@ EXPORT_SYMBOL(arch_spin_lock_wait_flags);
int arch_spin_trylock_retry ( arch_spinlock_t * lp )
{
unsigned int cpu = SPINLOCK_LOCKVAL ;
unsigned int owner ;
int count ;
int cpu = SPINLOCK_LOCKVAL ;
int owner , count ;
for ( count = spin_retry ; count > 0 ; count - - ) {
owner = READ_ONCE ( lp - > lock ) ;
/* Try to get the lock if it is free. */
if ( ! owner ) {
if ( _raw_compare_and_swap ( & lp - > lock , 0 , cpu ) )
if ( __atomic_cmpxchg_bool ( & lp - > lock , 0 , cpu ) )
return 1 ;
} else if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & lp - > lock , owner ) ;
compare_and_delay ( & lp - > lock , owner ) ;
}
return 0 ;
}
@ -147,8 +144,8 @@ EXPORT_SYMBOL(arch_spin_trylock_retry);
void _raw_read_lock_wait ( arch_rwlock_t * rw )
{
unsigned int owner , old ;
int count = spin_retry ;
int owner , old ;
# ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
__RAW_LOCK ( & rw - > lock , - 1 , __RAW_OP_ADD ) ;
@ -162,12 +159,12 @@ void _raw_read_lock_wait(arch_rwlock_t *rw)
}
old = ACCESS_ONCE ( rw - > lock ) ;
owner = ACCESS_ONCE ( rw - > owner ) ;
if ( ( int ) old < 0 ) {
if ( old < 0 ) {
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & rw - > lock , old ) ;
compare_and_delay ( & rw - > lock , old ) ;
continue ;
}
if ( _raw_compare_and_swap ( & rw - > lock , old , old + 1 ) )
if ( __atomic_cmpxchg_bool ( & rw - > lock , old , old + 1 ) )
return ;
}
}
@ -175,17 +172,17 @@ EXPORT_SYMBOL(_raw_read_lock_wait);
int _raw_read_trylock_retry ( arch_rwlock_t * rw )
{
unsigned int old ;
int count = spin_retry ;
int old ;
while ( count - - > 0 ) {
old = ACCESS_ONCE ( rw - > lock ) ;
if ( ( int ) old < 0 ) {
if ( old < 0 ) {
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & rw - > lock , old ) ;
compare_and_delay ( & rw - > lock , old ) ;
continue ;
}
if ( _raw_compare_and_swap ( & rw - > lock , old , old + 1 ) )
if ( __atomic_cmpxchg_bool ( & rw - > lock , old , old + 1 ) )
return 1 ;
}
return 0 ;
@ -194,10 +191,10 @@ EXPORT_SYMBOL(_raw_read_trylock_retry);
# ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
void _raw_write_lock_wait ( arch_rwlock_t * rw , unsigned int prev )
void _raw_write_lock_wait ( arch_rwlock_t * rw , int prev )
{
unsigned int owner , old ;
int count = spin_retry ;
int owner , old ;
owner = 0 ;
while ( 1 ) {
@ -209,14 +206,14 @@ void _raw_write_lock_wait(arch_rwlock_t *rw, unsigned int prev)
old = ACCESS_ONCE ( rw - > lock ) ;
owner = ACCESS_ONCE ( rw - > owner ) ;
smp_mb ( ) ;
if ( ( int ) old > = 0 ) {
if ( old > = 0 ) {
prev = __RAW_LOCK ( & rw - > lock , 0x80000000 , __RAW_OP_OR ) ;
old = prev ;
}
if ( ( old & 0x7fffffff ) = = 0 & & ( int ) prev > = 0 )
if ( ( old & 0x7fffffff ) = = 0 & & prev > = 0 )
break ;
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & rw - > lock , old ) ;
compare_and_delay ( & rw - > lock , old ) ;
}
}
EXPORT_SYMBOL ( _raw_write_lock_wait ) ;
@ -225,8 +222,8 @@ EXPORT_SYMBOL(_raw_write_lock_wait);
void _raw_write_lock_wait ( arch_rwlock_t * rw )
{
unsigned int owner , old , prev ;
int count = spin_retry ;
int owner , old , prev ;
prev = 0x80000000 ;
owner = 0 ;
@ -238,15 +235,15 @@ void _raw_write_lock_wait(arch_rwlock_t *rw)
}
old = ACCESS_ONCE ( rw - > lock ) ;
owner = ACCESS_ONCE ( rw - > owner ) ;
if ( ( int ) old > = 0 & &
_raw_compare_and_swap ( & rw - > lock , old , old | 0x80000000 ) )
if ( old > = 0 & &
__atomic_cmpxchg_bool ( & rw - > lock , old , old | 0x80000000 ) )
prev = old ;
else
smp_mb ( ) ;
if ( ( old & 0x7fffffff ) = = 0 & & ( int ) prev > = 0 )
if ( ( old & 0x7fffffff ) = = 0 & & prev > = 0 )
break ;
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & rw - > lock , old ) ;
compare_and_delay ( & rw - > lock , old ) ;
}
}
EXPORT_SYMBOL ( _raw_write_lock_wait ) ;
@ -255,24 +252,24 @@ EXPORT_SYMBOL(_raw_write_lock_wait);
int _raw_write_trylock_retry ( arch_rwlock_t * rw )
{
unsigned int old ;
int count = spin_retry ;
int old ;
while ( count - - > 0 ) {
old = ACCESS_ONCE ( rw - > lock ) ;
if ( old ) {
if ( MACHINE_HAS_CAD )
_raw_ compare_and_delay( & rw - > lock , old ) ;
compare_and_delay ( & rw - > lock , old ) ;
continue ;
}
if ( _raw_compare_and_swap ( & rw - > lock , 0 , 0x80000000 ) )
if ( __atomic_cmpxchg_bool ( & rw - > lock , 0 , 0x80000000 ) )
return 1 ;
}
return 0 ;
}
EXPORT_SYMBOL ( _raw_write_trylock_retry ) ;
void arch_lock_relax ( unsigned int cpu )
void arch_lock_relax ( int cpu )
{
if ( ! cpu )
return ;