locking/rwsem: Convert sem->count to 'atomic_long_t'
Convert the rwsem count variable to an atomic_long_t since we use it as an atomic variable. This also allows us to remove the rwsem_atomic_{add,update}() "abstraction" which would now be an unnecesary level of indirection. In follow up patches, we also remove the rwsem_atomic_{add,update}() definitions across the various architectures. Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Jason Low <jason.low2@hpe.com> [ Build warning fixes on various architectures. ] Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Jason Low <jason.low2@hp.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Hurley <peter@hurleysoftware.com> Cc: Terry Rudd <terry.rudd@hpe.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tim Chen <tim.c.chen@linux.intel.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Waiman Long <Waiman.Long@hpe.com> Link: http://lkml.kernel.org/r/1465017963-4839-2-git-send-email-jason.low2@hpe.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -40,7 +40,7 @@
|
||||
static inline void
|
||||
__down_read (struct rw_semaphore *sem)
|
||||
{
|
||||
long result = ia64_fetchadd8_acq((unsigned long *)&sem->count, 1);
|
||||
long result = ia64_fetchadd8_acq((unsigned long *)&sem->count.counter, 1);
|
||||
|
||||
if (result < 0)
|
||||
rwsem_down_read_failed(sem);
|
||||
@@ -55,9 +55,9 @@ ___down_write (struct rw_semaphore *sem)
|
||||
long old, new;
|
||||
|
||||
do {
|
||||
old = sem->count;
|
||||
old = atomic_long_read(&sem->count);
|
||||
new = old + RWSEM_ACTIVE_WRITE_BIAS;
|
||||
} while (cmpxchg_acq(&sem->count, old, new) != old);
|
||||
} while (atomic_long_cmpxchg_acquire(&sem->count, old, new) != old);
|
||||
|
||||
return old;
|
||||
}
|
||||
@@ -85,7 +85,7 @@ __down_write_killable (struct rw_semaphore *sem)
|
||||
static inline void
|
||||
__up_read (struct rw_semaphore *sem)
|
||||
{
|
||||
long result = ia64_fetchadd8_rel((unsigned long *)&sem->count, -1);
|
||||
long result = ia64_fetchadd8_rel((unsigned long *)&sem->count.counter, -1);
|
||||
|
||||
if (result < 0 && (--result & RWSEM_ACTIVE_MASK) == 0)
|
||||
rwsem_wake(sem);
|
||||
@@ -100,9 +100,9 @@ __up_write (struct rw_semaphore *sem)
|
||||
long old, new;
|
||||
|
||||
do {
|
||||
old = sem->count;
|
||||
old = atomic_long_read(&sem->count);
|
||||
new = old - RWSEM_ACTIVE_WRITE_BIAS;
|
||||
} while (cmpxchg_rel(&sem->count, old, new) != old);
|
||||
} while (atomic_long_cmpxchg_release(&sem->count, old, new) != old);
|
||||
|
||||
if (new < 0 && (new & RWSEM_ACTIVE_MASK) == 0)
|
||||
rwsem_wake(sem);
|
||||
@@ -115,8 +115,8 @@ static inline int
|
||||
__down_read_trylock (struct rw_semaphore *sem)
|
||||
{
|
||||
long tmp;
|
||||
while ((tmp = sem->count) >= 0) {
|
||||
if (tmp == cmpxchg_acq(&sem->count, tmp, tmp+1)) {
|
||||
while ((tmp = atomic_long_read(&sem->count)) >= 0) {
|
||||
if (tmp == atomic_long_cmpxchg_acquire(&sem->count, tmp, tmp+1)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -129,8 +129,8 @@ __down_read_trylock (struct rw_semaphore *sem)
|
||||
static inline int
|
||||
__down_write_trylock (struct rw_semaphore *sem)
|
||||
{
|
||||
long tmp = cmpxchg_acq(&sem->count, RWSEM_UNLOCKED_VALUE,
|
||||
RWSEM_ACTIVE_WRITE_BIAS);
|
||||
long tmp = atomic_long_cmpxchg_acquire(&sem->count,
|
||||
RWSEM_UNLOCKED_VALUE, RWSEM_ACTIVE_WRITE_BIAS);
|
||||
return tmp == RWSEM_UNLOCKED_VALUE;
|
||||
}
|
||||
|
||||
@@ -143,9 +143,9 @@ __downgrade_write (struct rw_semaphore *sem)
|
||||
long old, new;
|
||||
|
||||
do {
|
||||
old = sem->count;
|
||||
old = atomic_long_read(&sem->count);
|
||||
new = old - RWSEM_WAITING_BIAS;
|
||||
} while (cmpxchg_rel(&sem->count, old, new) != old);
|
||||
} while (atomic_long_cmpxchg_release(&sem->count, old, new) != old);
|
||||
|
||||
if (old < 0)
|
||||
rwsem_downgrade_wake(sem);
|
||||
|
Reference in New Issue
Block a user