]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/ia64/include/asm/rwsem.h
locking/rwsem: Remove rwsem_atomic_add() and rwsem_atomic_update()
[karo-tx-linux.git] / arch / ia64 / include / asm / rwsem.h
index ce112472bdd65a10072eecf995ef5053cbae2e41..8fa98dd303b4b4733f862cce39cca2b82235f1b7 100644 (file)
@@ -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);
@@ -49,27 +49,43 @@ __down_read (struct rw_semaphore *sem)
 /*
  * lock for writing
  */
-static inline void
-__down_write (struct rw_semaphore *sem)
+static inline long
+___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;
+}
 
-       if (old != 0)
+static inline void
+__down_write (struct rw_semaphore *sem)
+{
+       if (___down_write(sem))
                rwsem_down_write_failed(sem);
 }
 
+static inline int
+__down_write_killable (struct rw_semaphore *sem)
+{
+       if (___down_write(sem))
+               if (IS_ERR(rwsem_down_write_failed_killable(sem)))
+                       return -EINTR;
+
+       return 0;
+}
+
 /*
  * unlock after reading
  */
 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);
@@ -84,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);
@@ -99,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;
                }
        }
@@ -113,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;
 }
 
@@ -127,19 +143,12 @@ __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);
 }
 
-/*
- * Implement atomic add functionality.  These used to be "inline" functions, but GCC v3.1
- * doesn't quite optimize this stuff right and ends up with bad calls to fetchandadd.
- */
-#define rwsem_atomic_add(delta, sem)   atomic64_add(delta, (atomic64_t *)(&(sem)->count))
-#define rwsem_atomic_update(delta, sem)        atomic64_add_return(delta, (atomic64_t *)(&(sem)->count))
-
 #endif /* _ASM_IA64_RWSEM_H */