[IA64] Fix bug in ia64 specific down() function

Chen, Kenneth W wrote:
> The memory order semantics for include/asm-ia64/semaphore.h:down()
> doesn't look right.  It is using atomic_dec_return, which eventually
> translate into ia64_fetch_and_add() that uses release semantics.
> Shouldn't it use acquire semantics?

Use ia64_fetchadd() instead of atomic_dec_return()

Acked-by: Ken Chen <kenneth.w.chen@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
Zoltan Menyhart 2006-01-13 17:25:23 +01:00 committed by Tony Luck
parent 8d08aed8d7
commit 4b16bfbf8f

View file

@ -61,7 +61,7 @@ static inline void
down (struct semaphore *sem) down (struct semaphore *sem)
{ {
might_sleep(); might_sleep();
if (atomic_dec_return(&sem->count) < 0) if (ia64_fetchadd(-1, &sem->count.counter, acq) < 1)
__down(sem); __down(sem);
} }
@ -75,7 +75,7 @@ down_interruptible (struct semaphore * sem)
int ret = 0; int ret = 0;
might_sleep(); might_sleep();
if (atomic_dec_return(&sem->count) < 0) if (ia64_fetchadd(-1, &sem->count.counter, acq) < 1)
ret = __down_interruptible(sem); ret = __down_interruptible(sem);
return ret; return ret;
} }
@ -85,7 +85,7 @@ down_trylock (struct semaphore *sem)
{ {
int ret = 0; int ret = 0;
if (atomic_dec_return(&sem->count) < 0) if (ia64_fetchadd(-1, &sem->count.counter, acq) < 1)
ret = __down_trylock(sem); ret = __down_trylock(sem);
return ret; return ret;
} }
@ -93,7 +93,7 @@ down_trylock (struct semaphore *sem)
static inline void static inline void
up (struct semaphore * sem) up (struct semaphore * sem)
{ {
if (atomic_inc_return(&sem->count) <= 0) if (ia64_fetchadd(1, &sem->count.counter, rel) <= -1)
__up(sem); __up(sem);
} }