fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / asm-s390 / rwsem.h
index 0422a08..90f4ecc 100644 (file)
@@ -61,6 +61,9 @@ struct rw_semaphore {
        signed long             count;
        spinlock_t              wait_lock;
        struct list_head        wait_list;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+       struct lockdep_map      dep_map;
+#endif
 };
 
 #ifndef __s390x__
@@ -80,8 +83,16 @@ struct rw_semaphore {
 /*
  * initialisation
  */
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname }
+#else
+# define __RWSEM_DEP_MAP_INIT(lockname)
+#endif
+
 #define __RWSEM_INITIALIZER(name) \
-{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) }
+{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \
+  __RWSEM_DEP_MAP_INIT(name) }
 
 #define DECLARE_RWSEM(name) \
        struct rw_semaphore name = __RWSEM_INITIALIZER(name)
@@ -93,6 +104,17 @@ static inline void init_rwsem(struct rw_semaphore *sem)
        INIT_LIST_HEAD(&sem->wait_list);
 }
 
+extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
+                        struct lock_class_key *key);
+
+#define init_rwsem(sem)                                \
+do {                                           \
+       static struct lock_class_key __key;     \
+                                               \
+       __init_rwsem((sem), #sem, &__key);      \
+} while (0)
+
+
 /*
  * lock for reading
  */
@@ -100,23 +122,23 @@ static inline void __down_read(struct rw_semaphore *sem)
 {
        signed long old, new;
 
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   ahi  %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       ahi     %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   aghi %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       aghi    %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count),
-                 "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" );
+                 "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory");
        if (old < 0)
                rwsem_down_read_failed(sem);
 }
@@ -128,59 +150,64 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
 {
        signed long old, new;
 
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: ltr  %1,%0\n"
-               "   jm   1f\n"
-               "   ahi  %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b\n"
+               "       l       %0,0(%3)\n"
+               "0:     ltr     %1,%0\n"
+               "       jm      1f\n"
+               "       ahi     %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b\n"
                "1:"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: ltgr %1,%0\n"
-               "   jm   1f\n"
-               "   aghi %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b\n"
+               "       lg      %0,0(%3)\n"
+               "0:     ltgr    %1,%0\n"
+               "       jm      1f\n"
+               "       aghi    %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b\n"
                "1:"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count),
-                 "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" );
+                 "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory");
        return old >= 0 ? 1 : 0;
 }
 
 /*
  * lock for writing
  */
-static inline void __down_write(struct rw_semaphore *sem)
+static inline void __down_write_nested(struct rw_semaphore *sem, int subclass)
 {
        signed long old, new, tmp;
 
        tmp = RWSEM_ACTIVE_WRITE_BIAS;
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   a    %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       a       %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   ag   %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       ag      %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count), "m" (tmp)
-               : "cc", "memory" );
+               : "cc", "memory");
        if (old != 0)
                rwsem_down_write_failed(sem);
 }
 
+static inline void __down_write(struct rw_semaphore *sem)
+{
+       __down_write_nested(sem, 0);
+}
+
 /*
  * trylock for writing -- returns 1 if successful, 0 if contention
  */
@@ -188,24 +215,24 @@ static inline int __down_write_trylock(struct rw_semaphore *sem)
 {
        signed long old;
 
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%2)\n"
-               "0: ltr  %0,%0\n"
-               "   jnz  1f\n"
-               "   cs   %0,%4,0(%2)\n"
-               "   jl   0b\n"
+               "       l       %0,0(%2)\n"
+               "0:     ltr     %0,%0\n"
+               "       jnz     1f\n"
+               "       cs      %0,%4,0(%2)\n"
+               "       jl      0b\n"
 #else /* __s390x__ */
-               "   lg   %0,0(%2)\n"
-               "0: ltgr %0,%0\n"
-               "   jnz  1f\n"
-               "   csg  %0,%4,0(%2)\n"
-               "   jl   0b\n"
+               "       lg      %0,0(%2)\n"
+               "0:     ltgr    %0,%0\n"
+               "       jnz     1f\n"
+               "       csg     %0,%4,0(%2)\n"
+               "       jl      0b\n"
 #endif /* __s390x__ */
                "1:"
-                : "=&d" (old), "=m" (sem->count)
+               : "=&d" (old), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count),
-                 "d" (RWSEM_ACTIVE_WRITE_BIAS) : "cc", "memory" );
+                 "d" (RWSEM_ACTIVE_WRITE_BIAS) : "cc", "memory");
        return (old == RWSEM_UNLOCKED_VALUE) ? 1 : 0;
 }
 
@@ -216,24 +243,24 @@ static inline void __up_read(struct rw_semaphore *sem)
 {
        signed long old, new;
 
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   ahi  %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       ahi     %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   aghi %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       aghi    %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count),
                  "i" (-RWSEM_ACTIVE_READ_BIAS)
-               : "cc", "memory" );
+               : "cc", "memory");
        if (new < 0)
                if ((new & RWSEM_ACTIVE_MASK) == 0)
                        rwsem_wake(sem);
@@ -247,23 +274,23 @@ static inline void __up_write(struct rw_semaphore *sem)
        signed long old, new, tmp;
 
        tmp = -RWSEM_ACTIVE_WRITE_BIAS;
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   a    %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       a       %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   ag   %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       ag      %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count), "m" (tmp)
-               : "cc", "memory" );
+               : "cc", "memory");
        if (new < 0)
                if ((new & RWSEM_ACTIVE_MASK) == 0)
                        rwsem_wake(sem);
@@ -277,23 +304,23 @@ static inline void __downgrade_write(struct rw_semaphore *sem)
        signed long old, new, tmp;
 
        tmp = -RWSEM_WAITING_BIAS;
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   a    %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       a       %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   ag   %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       ag      %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count), "m" (tmp)
-               : "cc", "memory" );
+               : "cc", "memory");
        if (new > 1)
                rwsem_downgrade_wake(sem);
 }
@@ -305,23 +332,23 @@ static inline void rwsem_atomic_add(long delta, struct rw_semaphore *sem)
 {
        signed long old, new;
 
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   ar   %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       ar      %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   agr  %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       agr     %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count), "d" (delta)
-               : "cc", "memory" );
+               : "cc", "memory");
 }
 
 /*
@@ -331,23 +358,23 @@ static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem)
 {
        signed long old, new;
 
-       __asm__ __volatile__(
+       asm volatile(
 #ifndef __s390x__
-               "   l    %0,0(%3)\n"
-               "0: lr   %1,%0\n"
-               "   ar   %1,%5\n"
-               "   cs   %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       l       %0,0(%3)\n"
+               "0:     lr      %1,%0\n"
+               "       ar      %1,%5\n"
+               "       cs      %0,%1,0(%3)\n"
+               "       jl      0b"
 #else /* __s390x__ */
-               "   lg   %0,0(%3)\n"
-               "0: lgr  %1,%0\n"
-               "   agr  %1,%5\n"
-               "   csg  %0,%1,0(%3)\n"
-               "   jl   0b"
+               "       lg      %0,0(%3)\n"
+               "0:     lgr     %1,%0\n"
+               "       agr     %1,%5\n"
+               "       csg     %0,%1,0(%3)\n"
+               "       jl      0b"
 #endif /* __s390x__ */
-                : "=&d" (old), "=&d" (new), "=m" (sem->count)
+               : "=&d" (old), "=&d" (new), "=m" (sem->count)
                : "a" (&sem->count), "m" (sem->count), "d" (delta)
-               : "cc", "memory" );
+               : "cc", "memory");
        return new;
 }