diff options
-rw-r--r-- | arch/Kconfig | 3 | ||||
-rw-r--r-- | arch/s390/Kconfig | 1 | ||||
-rw-r--r-- | include/asm-generic/percpu.h | 52 | ||||
-rw-r--r-- | include/linux/percpu.h | 52 | ||||
-rw-r--r-- | kernel/mutex.c | 3 |
5 files changed, 58 insertions, 53 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index dc81b34c5d82..78a35e9dc104 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -109,3 +109,6 @@ config HAVE_CLK | |||
109 | 109 | ||
110 | config HAVE_DMA_API_DEBUG | 110 | config HAVE_DMA_API_DEBUG |
111 | bool | 111 | bool |
112 | |||
113 | config HAVE_DEFAULT_NO_SPIN_MUTEXES | ||
114 | bool | ||
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index dcb667c4375a..2eca5fe0e75b 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -82,6 +82,7 @@ config S390 | |||
82 | select USE_GENERIC_SMP_HELPERS if SMP | 82 | select USE_GENERIC_SMP_HELPERS if SMP |
83 | select HAVE_SYSCALL_WRAPPERS | 83 | select HAVE_SYSCALL_WRAPPERS |
84 | select HAVE_FUNCTION_TRACER | 84 | select HAVE_FUNCTION_TRACER |
85 | select HAVE_DEFAULT_NO_SPIN_MUTEXES | ||
85 | select HAVE_OPROFILE | 86 | select HAVE_OPROFILE |
86 | select HAVE_KPROBES | 87 | select HAVE_KPROBES |
87 | select HAVE_KRETPROBES | 88 | select HAVE_KRETPROBES |
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 00f45ff081a6..b0e63c672ebd 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h | |||
@@ -80,56 +80,4 @@ extern void setup_per_cpu_areas(void); | |||
80 | #define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \ | 80 | #define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \ |
81 | __typeof__(type) per_cpu_var(name) | 81 | __typeof__(type) per_cpu_var(name) |
82 | 82 | ||
83 | /* | ||
84 | * Optional methods for optimized non-lvalue per-cpu variable access. | ||
85 | * | ||
86 | * @var can be a percpu variable or a field of it and its size should | ||
87 | * equal char, int or long. percpu_read() evaluates to a lvalue and | ||
88 | * all others to void. | ||
89 | * | ||
90 | * These operations are guaranteed to be atomic w.r.t. preemption. | ||
91 | * The generic versions use plain get/put_cpu_var(). Archs are | ||
92 | * encouraged to implement single-instruction alternatives which don't | ||
93 | * require preemption protection. | ||
94 | */ | ||
95 | #ifndef percpu_read | ||
96 | # define percpu_read(var) \ | ||
97 | ({ \ | ||
98 | typeof(per_cpu_var(var)) __tmp_var__; \ | ||
99 | __tmp_var__ = get_cpu_var(var); \ | ||
100 | put_cpu_var(var); \ | ||
101 | __tmp_var__; \ | ||
102 | }) | ||
103 | #endif | ||
104 | |||
105 | #define __percpu_generic_to_op(var, val, op) \ | ||
106 | do { \ | ||
107 | get_cpu_var(var) op val; \ | ||
108 | put_cpu_var(var); \ | ||
109 | } while (0) | ||
110 | |||
111 | #ifndef percpu_write | ||
112 | # define percpu_write(var, val) __percpu_generic_to_op(var, (val), =) | ||
113 | #endif | ||
114 | |||
115 | #ifndef percpu_add | ||
116 | # define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=) | ||
117 | #endif | ||
118 | |||
119 | #ifndef percpu_sub | ||
120 | # define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=) | ||
121 | #endif | ||
122 | |||
123 | #ifndef percpu_and | ||
124 | # define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=) | ||
125 | #endif | ||
126 | |||
127 | #ifndef percpu_or | ||
128 | # define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=) | ||
129 | #endif | ||
130 | |||
131 | #ifndef percpu_xor | ||
132 | # define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) | ||
133 | #endif | ||
134 | |||
135 | #endif /* _ASM_GENERIC_PERCPU_H_ */ | 83 | #endif /* _ASM_GENERIC_PERCPU_H_ */ |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index ee5615d65211..cfda2d5ad319 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -168,4 +168,56 @@ static inline void free_percpu(void *p) | |||
168 | #define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type), \ | 168 | #define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type), \ |
169 | __alignof__(type)) | 169 | __alignof__(type)) |
170 | 170 | ||
171 | /* | ||
172 | * Optional methods for optimized non-lvalue per-cpu variable access. | ||
173 | * | ||
174 | * @var can be a percpu variable or a field of it and its size should | ||
175 | * equal char, int or long. percpu_read() evaluates to a lvalue and | ||
176 | * all others to void. | ||
177 | * | ||
178 | * These operations are guaranteed to be atomic w.r.t. preemption. | ||
179 | * The generic versions use plain get/put_cpu_var(). Archs are | ||
180 | * encouraged to implement single-instruction alternatives which don't | ||
181 | * require preemption protection. | ||
182 | */ | ||
183 | #ifndef percpu_read | ||
184 | # define percpu_read(var) \ | ||
185 | ({ \ | ||
186 | typeof(per_cpu_var(var)) __tmp_var__; \ | ||
187 | __tmp_var__ = get_cpu_var(var); \ | ||
188 | put_cpu_var(var); \ | ||
189 | __tmp_var__; \ | ||
190 | }) | ||
191 | #endif | ||
192 | |||
193 | #define __percpu_generic_to_op(var, val, op) \ | ||
194 | do { \ | ||
195 | get_cpu_var(var) op val; \ | ||
196 | put_cpu_var(var); \ | ||
197 | } while (0) | ||
198 | |||
199 | #ifndef percpu_write | ||
200 | # define percpu_write(var, val) __percpu_generic_to_op(var, (val), =) | ||
201 | #endif | ||
202 | |||
203 | #ifndef percpu_add | ||
204 | # define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=) | ||
205 | #endif | ||
206 | |||
207 | #ifndef percpu_sub | ||
208 | # define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=) | ||
209 | #endif | ||
210 | |||
211 | #ifndef percpu_and | ||
212 | # define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=) | ||
213 | #endif | ||
214 | |||
215 | #ifndef percpu_or | ||
216 | # define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=) | ||
217 | #endif | ||
218 | |||
219 | #ifndef percpu_xor | ||
220 | # define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) | ||
221 | #endif | ||
222 | |||
171 | #endif /* __LINUX_PERCPU_H */ | 223 | #endif /* __LINUX_PERCPU_H */ |
diff --git a/kernel/mutex.c b/kernel/mutex.c index 5d79781394a3..507cf2b5e9f1 100644 --- a/kernel/mutex.c +++ b/kernel/mutex.c | |||
@@ -148,7 +148,8 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | |||
148 | 148 | ||
149 | preempt_disable(); | 149 | preempt_disable(); |
150 | mutex_acquire(&lock->dep_map, subclass, 0, ip); | 150 | mutex_acquire(&lock->dep_map, subclass, 0, ip); |
151 | #if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) | 151 | #if defined(CONFIG_SMP) && !defined(CONFIG_DEBUG_MUTEXES) && \ |
152 | !defined(CONFIG_HAVE_DEFAULT_NO_SPIN_MUTEXES) | ||
152 | /* | 153 | /* |
153 | * Optimistic spinning. | 154 | * Optimistic spinning. |
154 | * | 155 | * |