aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-s390
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-s390')
-rw-r--r--include/asm-s390/spinlock.h19
-rw-r--r--include/asm-s390/spinlock_types.h1
2 files changed, 6 insertions, 14 deletions
diff --git a/include/asm-s390/spinlock.h b/include/asm-s390/spinlock.h
index 3fd43826fd0b..c1d6e7e304e2 100644
--- a/include/asm-s390/spinlock.h
+++ b/include/asm-s390/spinlock.h
@@ -58,39 +58,32 @@ _raw_compare_and_swap(volatile unsigned int *lock,
58 do { while (__raw_spin_is_locked(lock)) \ 58 do { while (__raw_spin_is_locked(lock)) \
59 _raw_spin_relax(lock); } while (0) 59 _raw_spin_relax(lock); } while (0)
60 60
61extern void _raw_spin_lock_wait(raw_spinlock_t *, unsigned int pc); 61extern void _raw_spin_lock_wait(raw_spinlock_t *);
62extern int _raw_spin_trylock_retry(raw_spinlock_t *, unsigned int pc); 62extern int _raw_spin_trylock_retry(raw_spinlock_t *);
63extern void _raw_spin_relax(raw_spinlock_t *lock); 63extern void _raw_spin_relax(raw_spinlock_t *lock);
64 64
65static inline void __raw_spin_lock(raw_spinlock_t *lp) 65static inline void __raw_spin_lock(raw_spinlock_t *lp)
66{ 66{
67 unsigned long pc = 1 | (unsigned long) __builtin_return_address(0);
68 int old; 67 int old;
69 68
70 old = _raw_compare_and_swap(&lp->owner_cpu, 0, ~smp_processor_id()); 69 old = _raw_compare_and_swap(&lp->owner_cpu, 0, ~smp_processor_id());
71 if (likely(old == 0)) { 70 if (likely(old == 0))
72 lp->owner_pc = pc;
73 return; 71 return;
74 } 72 _raw_spin_lock_wait(lp);
75 _raw_spin_lock_wait(lp, pc);
76} 73}
77 74
78static inline int __raw_spin_trylock(raw_spinlock_t *lp) 75static inline int __raw_spin_trylock(raw_spinlock_t *lp)
79{ 76{
80 unsigned long pc = 1 | (unsigned long) __builtin_return_address(0);
81 int old; 77 int old;
82 78
83 old = _raw_compare_and_swap(&lp->owner_cpu, 0, ~smp_processor_id()); 79 old = _raw_compare_and_swap(&lp->owner_cpu, 0, ~smp_processor_id());
84 if (likely(old == 0)) { 80 if (likely(old == 0))
85 lp->owner_pc = pc;
86 return 1; 81 return 1;
87 } 82 return _raw_spin_trylock_retry(lp);
88 return _raw_spin_trylock_retry(lp, pc);
89} 83}
90 84
91static inline void __raw_spin_unlock(raw_spinlock_t *lp) 85static inline void __raw_spin_unlock(raw_spinlock_t *lp)
92{ 86{
93 lp->owner_pc = 0;
94 _raw_compare_and_swap(&lp->owner_cpu, lp->owner_cpu, 0); 87 _raw_compare_and_swap(&lp->owner_cpu, lp->owner_cpu, 0);
95} 88}
96 89
diff --git a/include/asm-s390/spinlock_types.h b/include/asm-s390/spinlock_types.h
index b7ac13f7aa37..654abc40de04 100644
--- a/include/asm-s390/spinlock_types.h
+++ b/include/asm-s390/spinlock_types.h
@@ -7,7 +7,6 @@
7 7
8typedef struct { 8typedef struct {
9 volatile unsigned int owner_cpu; 9 volatile unsigned int owner_cpu;
10 volatile unsigned int owner_pc;
11} __attribute__ ((aligned (4))) raw_spinlock_t; 10} __attribute__ ((aligned (4))) raw_spinlock_t;
12 11
13#define __RAW_SPIN_LOCK_UNLOCKED { 0 } 12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }