git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
include
/
asm-s390
/
rwsem.h
diff --git
a/include/asm-s390/rwsem.h
b/include/asm-s390/rwsem.h
index
0422a08
..
90f4ecc
100644
(file)
--- a/
include/asm-s390/rwsem.h
+++ b/
include/asm-s390/rwsem.h
@@
-61,6
+61,9
@@
struct rw_semaphore {
signed long count;
spinlock_t wait_lock;
struct list_head wait_list;
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__
};
#ifndef __s390x__
@@
-80,8
+83,16
@@
struct rw_semaphore {
/*
* initialisation
*/
/*
* 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) \
#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)
#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);
}
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
*/
/*
* lock for reading
*/
@@
-100,23
+122,23
@@
static inline void __down_read(struct rw_semaphore *sem)
{
signed long old, new;
{
signed long old, new;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "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);
}
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;
{
signed long old, new;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
"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__ */
"1:"
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "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
*/
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;
{
signed long old, new, tmp;
tmp = RWSEM_ACTIVE_WRITE_BIAS;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "m" (sem->count), "m" (tmp)
: "a" (&sem->count), "m" (sem->count), "m" (tmp)
- : "cc", "memory"
);
+ : "cc", "memory");
if (old != 0)
rwsem_down_write_failed(sem);
}
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
*/
/*
* 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;
{
signed long old;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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:"
#endif /* __s390x__ */
"1:"
-
: "=&d" (old), "=m" (sem->count)
+ : "=&d" (old), "=m" (sem->count)
: "a" (&sem->count), "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;
}
return (old == RWSEM_UNLOCKED_VALUE) ? 1 : 0;
}
@@
-216,24
+243,24
@@
static inline void __up_read(struct rw_semaphore *sem)
{
signed long old, new;
{
signed long old, new;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#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)
: "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);
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;
signed long old, new, tmp;
tmp = -RWSEM_ACTIVE_WRITE_BIAS;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "m" (sem->count), "m" (tmp)
: "a" (&sem->count), "m" (sem->count), "m" (tmp)
- : "cc", "memory"
);
+ : "cc", "memory");
if (new < 0)
if ((new & RWSEM_ACTIVE_MASK) == 0)
rwsem_wake(sem);
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;
signed long old, new, tmp;
tmp = -RWSEM_WAITING_BIAS;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "m" (sem->count), "m" (tmp)
: "a" (&sem->count), "m" (sem->count), "m" (tmp)
- : "cc", "memory"
);
+ : "cc", "memory");
if (new > 1)
rwsem_downgrade_wake(sem);
}
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;
{
signed long old, new;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "m" (sem->count), "d" (delta)
: "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;
{
signed long old, new;
-
__asm__ __volatile__
(
+
asm volatile
(
#ifndef __s390x__
#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__ */
#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__ */
#endif /* __s390x__ */
-
: "=&d" (old), "=&d" (new), "=m" (sem->count)
+ : "=&d" (old), "=&d" (new), "=m" (sem->count)
: "a" (&sem->count), "m" (sem->count), "d" (delta)
: "a" (&sem->count), "m" (sem->count), "d" (delta)
- : "cc", "memory"
);
+ : "cc", "memory");
return new;
}
return new;
}