Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -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);
}
}