2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-11-18 23:54:26 +08:00

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