Commit 4b16bfbf authored by Zoltan Menyhart's avatar Zoltan Menyhart Committed by Tony Luck

[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: default avatarKen Chen <kenneth.w.chen@intel.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 8d08aed8
...@@ -61,7 +61,7 @@ static inline void ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment