diff options
Diffstat (limited to 'include/linux/percpu.h')
-rw-r--r-- | include/linux/percpu.h | 481 |
1 files changed, 430 insertions, 51 deletions
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 878836ca999c..d3a38d687104 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -2,10 +2,10 @@ | |||
2 | #define __LINUX_PERCPU_H | 2 | #define __LINUX_PERCPU_H |
3 | 3 | ||
4 | #include <linux/preempt.h> | 4 | #include <linux/preempt.h> |
5 | #include <linux/slab.h> /* For kmalloc() */ | ||
6 | #include <linux/smp.h> | 5 | #include <linux/smp.h> |
7 | #include <linux/cpumask.h> | 6 | #include <linux/cpumask.h> |
8 | #include <linux/pfn.h> | 7 | #include <linux/pfn.h> |
8 | #include <linux/init.h> | ||
9 | 9 | ||
10 | #include <asm/percpu.h> | 10 | #include <asm/percpu.h> |
11 | 11 | ||
@@ -27,14 +27,19 @@ | |||
27 | * we force a syntax error here if it isn't. | 27 | * we force a syntax error here if it isn't. |
28 | */ | 28 | */ |
29 | #define get_cpu_var(var) (*({ \ | 29 | #define get_cpu_var(var) (*({ \ |
30 | extern int simple_identifier_##var(void); \ | ||
31 | preempt_disable(); \ | 30 | preempt_disable(); \ |
32 | &__get_cpu_var(var); })) | 31 | &__get_cpu_var(var); })) |
33 | #define put_cpu_var(var) preempt_enable() | ||
34 | 32 | ||
35 | #ifdef CONFIG_SMP | 33 | /* |
34 | * The weird & is necessary because sparse considers (void)(var) to be | ||
35 | * a direct dereference of percpu variable (var). | ||
36 | */ | ||
37 | #define put_cpu_var(var) do { \ | ||
38 | (void)&(var); \ | ||
39 | preempt_enable(); \ | ||
40 | } while (0) | ||
36 | 41 | ||
37 | #ifndef CONFIG_HAVE_LEGACY_PER_CPU_AREA | 42 | #ifdef CONFIG_SMP |
38 | 43 | ||
39 | /* minimum unit size, also is the maximum supported allocation size */ | 44 | /* minimum unit size, also is the maximum supported allocation size */ |
40 | #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(64 << 10) | 45 | #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(64 << 10) |
@@ -129,31 +134,8 @@ extern int __init pcpu_page_first_chunk(size_t reserved_size, | |||
129 | */ | 134 | */ |
130 | #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) | 135 | #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))) |
131 | 136 | ||
132 | extern void *__alloc_reserved_percpu(size_t size, size_t align); | 137 | extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align); |
133 | 138 | extern bool is_kernel_percpu_address(unsigned long addr); | |
134 | #else /* CONFIG_HAVE_LEGACY_PER_CPU_AREA */ | ||
135 | |||
136 | struct percpu_data { | ||
137 | void *ptrs[1]; | ||
138 | }; | ||
139 | |||
140 | /* pointer disguising messes up the kmemleak objects tracking */ | ||
141 | #ifndef CONFIG_DEBUG_KMEMLEAK | ||
142 | #define __percpu_disguise(pdata) (struct percpu_data *)~(unsigned long)(pdata) | ||
143 | #else | ||
144 | #define __percpu_disguise(pdata) (struct percpu_data *)(pdata) | ||
145 | #endif | ||
146 | |||
147 | #define per_cpu_ptr(ptr, cpu) \ | ||
148 | ({ \ | ||
149 | struct percpu_data *__p = __percpu_disguise(ptr); \ | ||
150 | (__typeof__(ptr))__p->ptrs[(cpu)]; \ | ||
151 | }) | ||
152 | |||
153 | #endif /* CONFIG_HAVE_LEGACY_PER_CPU_AREA */ | ||
154 | |||
155 | extern void *__alloc_percpu(size_t size, size_t align); | ||
156 | extern void free_percpu(void *__pdata); | ||
157 | 139 | ||
158 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA | 140 | #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA |
159 | extern void __init setup_per_cpu_areas(void); | 141 | extern void __init setup_per_cpu_areas(void); |
@@ -163,20 +145,10 @@ extern void __init setup_per_cpu_areas(void); | |||
163 | 145 | ||
164 | #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); }) | 146 | #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); }) |
165 | 147 | ||
166 | static inline void *__alloc_percpu(size_t size, size_t align) | 148 | /* can't distinguish from other static vars, always false */ |
149 | static inline bool is_kernel_percpu_address(unsigned long addr) | ||
167 | { | 150 | { |
168 | /* | 151 | return false; |
169 | * Can't easily make larger alignment work with kmalloc. WARN | ||
170 | * on it. Larger alignment should only be used for module | ||
171 | * percpu sections on SMP for which this path isn't used. | ||
172 | */ | ||
173 | WARN_ON_ONCE(align > SMP_CACHE_BYTES); | ||
174 | return kzalloc(size, GFP_KERNEL); | ||
175 | } | ||
176 | |||
177 | static inline void free_percpu(void *p) | ||
178 | { | ||
179 | kfree(p); | ||
180 | } | 152 | } |
181 | 153 | ||
182 | static inline void __init setup_per_cpu_areas(void) { } | 154 | static inline void __init setup_per_cpu_areas(void) { } |
@@ -188,8 +160,12 @@ static inline void *pcpu_lpage_remapped(void *kaddr) | |||
188 | 160 | ||
189 | #endif /* CONFIG_SMP */ | 161 | #endif /* CONFIG_SMP */ |
190 | 162 | ||
191 | #define alloc_percpu(type) (type *)__alloc_percpu(sizeof(type), \ | 163 | extern void __percpu *__alloc_percpu(size_t size, size_t align); |
192 | __alignof__(type)) | 164 | extern void free_percpu(void __percpu *__pdata); |
165 | extern phys_addr_t per_cpu_ptr_to_phys(void *addr); | ||
166 | |||
167 | #define alloc_percpu(type) \ | ||
168 | (typeof(type) __percpu *)__alloc_percpu(sizeof(type), __alignof__(type)) | ||
193 | 169 | ||
194 | /* | 170 | /* |
195 | * Optional methods for optimized non-lvalue per-cpu variable access. | 171 | * Optional methods for optimized non-lvalue per-cpu variable access. |
@@ -206,17 +182,19 @@ static inline void *pcpu_lpage_remapped(void *kaddr) | |||
206 | #ifndef percpu_read | 182 | #ifndef percpu_read |
207 | # define percpu_read(var) \ | 183 | # define percpu_read(var) \ |
208 | ({ \ | 184 | ({ \ |
209 | typeof(per_cpu_var(var)) __tmp_var__; \ | 185 | typeof(var) *pr_ptr__ = &(var); \ |
210 | __tmp_var__ = get_cpu_var(var); \ | 186 | typeof(var) pr_ret__; \ |
211 | put_cpu_var(var); \ | 187 | pr_ret__ = get_cpu_var(*pr_ptr__); \ |
212 | __tmp_var__; \ | 188 | put_cpu_var(*pr_ptr__); \ |
189 | pr_ret__; \ | ||
213 | }) | 190 | }) |
214 | #endif | 191 | #endif |
215 | 192 | ||
216 | #define __percpu_generic_to_op(var, val, op) \ | 193 | #define __percpu_generic_to_op(var, val, op) \ |
217 | do { \ | 194 | do { \ |
218 | get_cpu_var(var) op val; \ | 195 | typeof(var) *pgto_ptr__ = &(var); \ |
219 | put_cpu_var(var); \ | 196 | get_cpu_var(*pgto_ptr__) op val; \ |
197 | put_cpu_var(*pgto_ptr__); \ | ||
220 | } while (0) | 198 | } while (0) |
221 | 199 | ||
222 | #ifndef percpu_write | 200 | #ifndef percpu_write |
@@ -243,4 +221,405 @@ do { \ | |||
243 | # define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) | 221 | # define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) |
244 | #endif | 222 | #endif |
245 | 223 | ||
224 | /* | ||
225 | * Branching function to split up a function into a set of functions that | ||
226 | * are called for different scalar sizes of the objects handled. | ||
227 | */ | ||
228 | |||
229 | extern void __bad_size_call_parameter(void); | ||
230 | |||
231 | #define __pcpu_size_call_return(stem, variable) \ | ||
232 | ({ typeof(variable) pscr_ret__; \ | ||
233 | __verify_pcpu_ptr(&(variable)); \ | ||
234 | switch(sizeof(variable)) { \ | ||
235 | case 1: pscr_ret__ = stem##1(variable);break; \ | ||
236 | case 2: pscr_ret__ = stem##2(variable);break; \ | ||
237 | case 4: pscr_ret__ = stem##4(variable);break; \ | ||
238 | case 8: pscr_ret__ = stem##8(variable);break; \ | ||
239 | default: \ | ||
240 | __bad_size_call_parameter();break; \ | ||
241 | } \ | ||
242 | pscr_ret__; \ | ||
243 | }) | ||
244 | |||
245 | #define __pcpu_size_call(stem, variable, ...) \ | ||
246 | do { \ | ||
247 | __verify_pcpu_ptr(&(variable)); \ | ||
248 | switch(sizeof(variable)) { \ | ||
249 | case 1: stem##1(variable, __VA_ARGS__);break; \ | ||
250 | case 2: stem##2(variable, __VA_ARGS__);break; \ | ||
251 | case 4: stem##4(variable, __VA_ARGS__);break; \ | ||
252 | case 8: stem##8(variable, __VA_ARGS__);break; \ | ||
253 | default: \ | ||
254 | __bad_size_call_parameter();break; \ | ||
255 | } \ | ||
256 | } while (0) | ||
257 | |||
258 | /* | ||
259 | * Optimized manipulation for memory allocated through the per cpu | ||
260 | * allocator or for addresses of per cpu variables. | ||
261 | * | ||
262 | * These operation guarantee exclusivity of access for other operations | ||
263 | * on the *same* processor. The assumption is that per cpu data is only | ||
264 | * accessed by a single processor instance (the current one). | ||
265 | * | ||
266 | * The first group is used for accesses that must be done in a | ||
267 | * preemption safe way since we know that the context is not preempt | ||
268 | * safe. Interrupts may occur. If the interrupt modifies the variable | ||
269 | * too then RMW actions will not be reliable. | ||
270 | * | ||
271 | * The arch code can provide optimized functions in two ways: | ||
272 | * | ||
273 | * 1. Override the function completely. F.e. define this_cpu_add(). | ||
274 | * The arch must then ensure that the various scalar format passed | ||
275 | * are handled correctly. | ||
276 | * | ||
277 | * 2. Provide functions for certain scalar sizes. F.e. provide | ||
278 | * this_cpu_add_2() to provide per cpu atomic operations for 2 byte | ||
279 | * sized RMW actions. If arch code does not provide operations for | ||
280 | * a scalar size then the fallback in the generic code will be | ||
281 | * used. | ||
282 | */ | ||
283 | |||
284 | #define _this_cpu_generic_read(pcp) \ | ||
285 | ({ typeof(pcp) ret__; \ | ||
286 | preempt_disable(); \ | ||
287 | ret__ = *this_cpu_ptr(&(pcp)); \ | ||
288 | preempt_enable(); \ | ||
289 | ret__; \ | ||
290 | }) | ||
291 | |||
292 | #ifndef this_cpu_read | ||
293 | # ifndef this_cpu_read_1 | ||
294 | # define this_cpu_read_1(pcp) _this_cpu_generic_read(pcp) | ||
295 | # endif | ||
296 | # ifndef this_cpu_read_2 | ||
297 | # define this_cpu_read_2(pcp) _this_cpu_generic_read(pcp) | ||
298 | # endif | ||
299 | # ifndef this_cpu_read_4 | ||
300 | # define this_cpu_read_4(pcp) _this_cpu_generic_read(pcp) | ||
301 | # endif | ||
302 | # ifndef this_cpu_read_8 | ||
303 | # define this_cpu_read_8(pcp) _this_cpu_generic_read(pcp) | ||
304 | # endif | ||
305 | # define this_cpu_read(pcp) __pcpu_size_call_return(this_cpu_read_, (pcp)) | ||
306 | #endif | ||
307 | |||
308 | #define _this_cpu_generic_to_op(pcp, val, op) \ | ||
309 | do { \ | ||
310 | preempt_disable(); \ | ||
311 | *__this_cpu_ptr(&(pcp)) op val; \ | ||
312 | preempt_enable(); \ | ||
313 | } while (0) | ||
314 | |||
315 | #ifndef this_cpu_write | ||
316 | # ifndef this_cpu_write_1 | ||
317 | # define this_cpu_write_1(pcp, val) _this_cpu_generic_to_op((pcp), (val), =) | ||
318 | # endif | ||
319 | # ifndef this_cpu_write_2 | ||
320 | # define this_cpu_write_2(pcp, val) _this_cpu_generic_to_op((pcp), (val), =) | ||
321 | # endif | ||
322 | # ifndef this_cpu_write_4 | ||
323 | # define this_cpu_write_4(pcp, val) _this_cpu_generic_to_op((pcp), (val), =) | ||
324 | # endif | ||
325 | # ifndef this_cpu_write_8 | ||
326 | # define this_cpu_write_8(pcp, val) _this_cpu_generic_to_op((pcp), (val), =) | ||
327 | # endif | ||
328 | # define this_cpu_write(pcp, val) __pcpu_size_call(this_cpu_write_, (pcp), (val)) | ||
329 | #endif | ||
330 | |||
331 | #ifndef this_cpu_add | ||
332 | # ifndef this_cpu_add_1 | ||
333 | # define this_cpu_add_1(pcp, val) _this_cpu_generic_to_op((pcp), (val), +=) | ||
334 | # endif | ||
335 | # ifndef this_cpu_add_2 | ||
336 | # define this_cpu_add_2(pcp, val) _this_cpu_generic_to_op((pcp), (val), +=) | ||
337 | # endif | ||
338 | # ifndef this_cpu_add_4 | ||
339 | # define this_cpu_add_4(pcp, val) _this_cpu_generic_to_op((pcp), (val), +=) | ||
340 | # endif | ||
341 | # ifndef this_cpu_add_8 | ||
342 | # define this_cpu_add_8(pcp, val) _this_cpu_generic_to_op((pcp), (val), +=) | ||
343 | # endif | ||
344 | # define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, (pcp), (val)) | ||
345 | #endif | ||
346 | |||
347 | #ifndef this_cpu_sub | ||
348 | # define this_cpu_sub(pcp, val) this_cpu_add((pcp), -(val)) | ||
349 | #endif | ||
350 | |||
351 | #ifndef this_cpu_inc | ||
352 | # define this_cpu_inc(pcp) this_cpu_add((pcp), 1) | ||
353 | #endif | ||
354 | |||
355 | #ifndef this_cpu_dec | ||
356 | # define this_cpu_dec(pcp) this_cpu_sub((pcp), 1) | ||
357 | #endif | ||
358 | |||
359 | #ifndef this_cpu_and | ||
360 | # ifndef this_cpu_and_1 | ||
361 | # define this_cpu_and_1(pcp, val) _this_cpu_generic_to_op((pcp), (val), &=) | ||
362 | # endif | ||
363 | # ifndef this_cpu_and_2 | ||
364 | # define this_cpu_and_2(pcp, val) _this_cpu_generic_to_op((pcp), (val), &=) | ||
365 | # endif | ||
366 | # ifndef this_cpu_and_4 | ||
367 | # define this_cpu_and_4(pcp, val) _this_cpu_generic_to_op((pcp), (val), &=) | ||
368 | # endif | ||
369 | # ifndef this_cpu_and_8 | ||
370 | # define this_cpu_and_8(pcp, val) _this_cpu_generic_to_op((pcp), (val), &=) | ||
371 | # endif | ||
372 | # define this_cpu_and(pcp, val) __pcpu_size_call(this_cpu_and_, (pcp), (val)) | ||
373 | #endif | ||
374 | |||
375 | #ifndef this_cpu_or | ||
376 | # ifndef this_cpu_or_1 | ||
377 | # define this_cpu_or_1(pcp, val) _this_cpu_generic_to_op((pcp), (val), |=) | ||
378 | # endif | ||
379 | # ifndef this_cpu_or_2 | ||
380 | # define this_cpu_or_2(pcp, val) _this_cpu_generic_to_op((pcp), (val), |=) | ||
381 | # endif | ||
382 | # ifndef this_cpu_or_4 | ||
383 | # define this_cpu_or_4(pcp, val) _this_cpu_generic_to_op((pcp), (val), |=) | ||
384 | # endif | ||
385 | # ifndef this_cpu_or_8 | ||
386 | # define this_cpu_or_8(pcp, val) _this_cpu_generic_to_op((pcp), (val), |=) | ||
387 | # endif | ||
388 | # define this_cpu_or(pcp, val) __pcpu_size_call(this_cpu_or_, (pcp), (val)) | ||
389 | #endif | ||
390 | |||
391 | #ifndef this_cpu_xor | ||
392 | # ifndef this_cpu_xor_1 | ||
393 | # define this_cpu_xor_1(pcp, val) _this_cpu_generic_to_op((pcp), (val), ^=) | ||
394 | # endif | ||
395 | # ifndef this_cpu_xor_2 | ||
396 | # define this_cpu_xor_2(pcp, val) _this_cpu_generic_to_op((pcp), (val), ^=) | ||
397 | # endif | ||
398 | # ifndef this_cpu_xor_4 | ||
399 | # define this_cpu_xor_4(pcp, val) _this_cpu_generic_to_op((pcp), (val), ^=) | ||
400 | # endif | ||
401 | # ifndef this_cpu_xor_8 | ||
402 | # define this_cpu_xor_8(pcp, val) _this_cpu_generic_to_op((pcp), (val), ^=) | ||
403 | # endif | ||
404 | # define this_cpu_xor(pcp, val) __pcpu_size_call(this_cpu_or_, (pcp), (val)) | ||
405 | #endif | ||
406 | |||
407 | /* | ||
408 | * Generic percpu operations that do not require preemption handling. | ||
409 | * Either we do not care about races or the caller has the | ||
410 | * responsibility of handling preemptions issues. Arch code can still | ||
411 | * override these instructions since the arch per cpu code may be more | ||
412 | * efficient and may actually get race freeness for free (that is the | ||
413 | * case for x86 for example). | ||
414 | * | ||
415 | * If there is no other protection through preempt disable and/or | ||
416 | * disabling interupts then one of these RMW operations can show unexpected | ||
417 | * behavior because the execution thread was rescheduled on another processor | ||
418 | * or an interrupt occurred and the same percpu variable was modified from | ||
419 | * the interrupt context. | ||
420 | */ | ||
421 | #ifndef __this_cpu_read | ||
422 | # ifndef __this_cpu_read_1 | ||
423 | # define __this_cpu_read_1(pcp) (*__this_cpu_ptr(&(pcp))) | ||
424 | # endif | ||
425 | # ifndef __this_cpu_read_2 | ||
426 | # define __this_cpu_read_2(pcp) (*__this_cpu_ptr(&(pcp))) | ||
427 | # endif | ||
428 | # ifndef __this_cpu_read_4 | ||
429 | # define __this_cpu_read_4(pcp) (*__this_cpu_ptr(&(pcp))) | ||
430 | # endif | ||
431 | # ifndef __this_cpu_read_8 | ||
432 | # define __this_cpu_read_8(pcp) (*__this_cpu_ptr(&(pcp))) | ||
433 | # endif | ||
434 | # define __this_cpu_read(pcp) __pcpu_size_call_return(__this_cpu_read_, (pcp)) | ||
435 | #endif | ||
436 | |||
437 | #define __this_cpu_generic_to_op(pcp, val, op) \ | ||
438 | do { \ | ||
439 | *__this_cpu_ptr(&(pcp)) op val; \ | ||
440 | } while (0) | ||
441 | |||
442 | #ifndef __this_cpu_write | ||
443 | # ifndef __this_cpu_write_1 | ||
444 | # define __this_cpu_write_1(pcp, val) __this_cpu_generic_to_op((pcp), (val), =) | ||
445 | # endif | ||
446 | # ifndef __this_cpu_write_2 | ||
447 | # define __this_cpu_write_2(pcp, val) __this_cpu_generic_to_op((pcp), (val), =) | ||
448 | # endif | ||
449 | # ifndef __this_cpu_write_4 | ||
450 | # define __this_cpu_write_4(pcp, val) __this_cpu_generic_to_op((pcp), (val), =) | ||
451 | # endif | ||
452 | # ifndef __this_cpu_write_8 | ||
453 | # define __this_cpu_write_8(pcp, val) __this_cpu_generic_to_op((pcp), (val), =) | ||
454 | # endif | ||
455 | # define __this_cpu_write(pcp, val) __pcpu_size_call(__this_cpu_write_, (pcp), (val)) | ||
456 | #endif | ||
457 | |||
458 | #ifndef __this_cpu_add | ||
459 | # ifndef __this_cpu_add_1 | ||
460 | # define __this_cpu_add_1(pcp, val) __this_cpu_generic_to_op((pcp), (val), +=) | ||
461 | # endif | ||
462 | # ifndef __this_cpu_add_2 | ||
463 | # define __this_cpu_add_2(pcp, val) __this_cpu_generic_to_op((pcp), (val), +=) | ||
464 | # endif | ||
465 | # ifndef __this_cpu_add_4 | ||
466 | # define __this_cpu_add_4(pcp, val) __this_cpu_generic_to_op((pcp), (val), +=) | ||
467 | # endif | ||
468 | # ifndef __this_cpu_add_8 | ||
469 | # define __this_cpu_add_8(pcp, val) __this_cpu_generic_to_op((pcp), (val), +=) | ||
470 | # endif | ||
471 | # define __this_cpu_add(pcp, val) __pcpu_size_call(__this_cpu_add_, (pcp), (val)) | ||
472 | #endif | ||
473 | |||
474 | #ifndef __this_cpu_sub | ||
475 | # define __this_cpu_sub(pcp, val) __this_cpu_add((pcp), -(val)) | ||
476 | #endif | ||
477 | |||
478 | #ifndef __this_cpu_inc | ||
479 | # define __this_cpu_inc(pcp) __this_cpu_add((pcp), 1) | ||
480 | #endif | ||
481 | |||
482 | #ifndef __this_cpu_dec | ||
483 | # define __this_cpu_dec(pcp) __this_cpu_sub((pcp), 1) | ||
484 | #endif | ||
485 | |||
486 | #ifndef __this_cpu_and | ||
487 | # ifndef __this_cpu_and_1 | ||
488 | # define __this_cpu_and_1(pcp, val) __this_cpu_generic_to_op((pcp), (val), &=) | ||
489 | # endif | ||
490 | # ifndef __this_cpu_and_2 | ||
491 | # define __this_cpu_and_2(pcp, val) __this_cpu_generic_to_op((pcp), (val), &=) | ||
492 | # endif | ||
493 | # ifndef __this_cpu_and_4 | ||
494 | # define __this_cpu_and_4(pcp, val) __this_cpu_generic_to_op((pcp), (val), &=) | ||
495 | # endif | ||
496 | # ifndef __this_cpu_and_8 | ||
497 | # define __this_cpu_and_8(pcp, val) __this_cpu_generic_to_op((pcp), (val), &=) | ||
498 | # endif | ||
499 | # define __this_cpu_and(pcp, val) __pcpu_size_call(__this_cpu_and_, (pcp), (val)) | ||
500 | #endif | ||
501 | |||
502 | #ifndef __this_cpu_or | ||
503 | # ifndef __this_cpu_or_1 | ||
504 | # define __this_cpu_or_1(pcp, val) __this_cpu_generic_to_op((pcp), (val), |=) | ||
505 | # endif | ||
506 | # ifndef __this_cpu_or_2 | ||
507 | # define __this_cpu_or_2(pcp, val) __this_cpu_generic_to_op((pcp), (val), |=) | ||
508 | # endif | ||
509 | # ifndef __this_cpu_or_4 | ||
510 | # define __this_cpu_or_4(pcp, val) __this_cpu_generic_to_op((pcp), (val), |=) | ||
511 | # endif | ||
512 | # ifndef __this_cpu_or_8 | ||
513 | # define __this_cpu_or_8(pcp, val) __this_cpu_generic_to_op((pcp), (val), |=) | ||
514 | # endif | ||
515 | # define __this_cpu_or(pcp, val) __pcpu_size_call(__this_cpu_or_, (pcp), (val)) | ||
516 | #endif | ||
517 | |||
518 | #ifndef __this_cpu_xor | ||
519 | # ifndef __this_cpu_xor_1 | ||
520 | # define __this_cpu_xor_1(pcp, val) __this_cpu_generic_to_op((pcp), (val), ^=) | ||
521 | # endif | ||
522 | # ifndef __this_cpu_xor_2 | ||
523 | # define __this_cpu_xor_2(pcp, val) __this_cpu_generic_to_op((pcp), (val), ^=) | ||
524 | # endif | ||
525 | # ifndef __this_cpu_xor_4 | ||
526 | # define __this_cpu_xor_4(pcp, val) __this_cpu_generic_to_op((pcp), (val), ^=) | ||
527 | # endif | ||
528 | # ifndef __this_cpu_xor_8 | ||
529 | # define __this_cpu_xor_8(pcp, val) __this_cpu_generic_to_op((pcp), (val), ^=) | ||
530 | # endif | ||
531 | # define __this_cpu_xor(pcp, val) __pcpu_size_call(__this_cpu_xor_, (pcp), (val)) | ||
532 | #endif | ||
533 | |||
534 | /* | ||
535 | * IRQ safe versions of the per cpu RMW operations. Note that these operations | ||
536 | * are *not* safe against modification of the same variable from another | ||
537 | * processors (which one gets when using regular atomic operations) | ||
538 | . They are guaranteed to be atomic vs. local interrupts and | ||
539 | * preemption only. | ||
540 | */ | ||
541 | #define irqsafe_cpu_generic_to_op(pcp, val, op) \ | ||
542 | do { \ | ||
543 | unsigned long flags; \ | ||
544 | local_irq_save(flags); \ | ||
545 | *__this_cpu_ptr(&(pcp)) op val; \ | ||
546 | local_irq_restore(flags); \ | ||
547 | } while (0) | ||
548 | |||
549 | #ifndef irqsafe_cpu_add | ||
550 | # ifndef irqsafe_cpu_add_1 | ||
551 | # define irqsafe_cpu_add_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) | ||
552 | # endif | ||
553 | # ifndef irqsafe_cpu_add_2 | ||
554 | # define irqsafe_cpu_add_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) | ||
555 | # endif | ||
556 | # ifndef irqsafe_cpu_add_4 | ||
557 | # define irqsafe_cpu_add_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) | ||
558 | # endif | ||
559 | # ifndef irqsafe_cpu_add_8 | ||
560 | # define irqsafe_cpu_add_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), +=) | ||
561 | # endif | ||
562 | # define irqsafe_cpu_add(pcp, val) __pcpu_size_call(irqsafe_cpu_add_, (pcp), (val)) | ||
563 | #endif | ||
564 | |||
565 | #ifndef irqsafe_cpu_sub | ||
566 | # define irqsafe_cpu_sub(pcp, val) irqsafe_cpu_add((pcp), -(val)) | ||
567 | #endif | ||
568 | |||
569 | #ifndef irqsafe_cpu_inc | ||
570 | # define irqsafe_cpu_inc(pcp) irqsafe_cpu_add((pcp), 1) | ||
571 | #endif | ||
572 | |||
573 | #ifndef irqsafe_cpu_dec | ||
574 | # define irqsafe_cpu_dec(pcp) irqsafe_cpu_sub((pcp), 1) | ||
575 | #endif | ||
576 | |||
577 | #ifndef irqsafe_cpu_and | ||
578 | # ifndef irqsafe_cpu_and_1 | ||
579 | # define irqsafe_cpu_and_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) | ||
580 | # endif | ||
581 | # ifndef irqsafe_cpu_and_2 | ||
582 | # define irqsafe_cpu_and_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) | ||
583 | # endif | ||
584 | # ifndef irqsafe_cpu_and_4 | ||
585 | # define irqsafe_cpu_and_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) | ||
586 | # endif | ||
587 | # ifndef irqsafe_cpu_and_8 | ||
588 | # define irqsafe_cpu_and_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), &=) | ||
589 | # endif | ||
590 | # define irqsafe_cpu_and(pcp, val) __pcpu_size_call(irqsafe_cpu_and_, (val)) | ||
591 | #endif | ||
592 | |||
593 | #ifndef irqsafe_cpu_or | ||
594 | # ifndef irqsafe_cpu_or_1 | ||
595 | # define irqsafe_cpu_or_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) | ||
596 | # endif | ||
597 | # ifndef irqsafe_cpu_or_2 | ||
598 | # define irqsafe_cpu_or_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) | ||
599 | # endif | ||
600 | # ifndef irqsafe_cpu_or_4 | ||
601 | # define irqsafe_cpu_or_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) | ||
602 | # endif | ||
603 | # ifndef irqsafe_cpu_or_8 | ||
604 | # define irqsafe_cpu_or_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), |=) | ||
605 | # endif | ||
606 | # define irqsafe_cpu_or(pcp, val) __pcpu_size_call(irqsafe_cpu_or_, (val)) | ||
607 | #endif | ||
608 | |||
609 | #ifndef irqsafe_cpu_xor | ||
610 | # ifndef irqsafe_cpu_xor_1 | ||
611 | # define irqsafe_cpu_xor_1(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) | ||
612 | # endif | ||
613 | # ifndef irqsafe_cpu_xor_2 | ||
614 | # define irqsafe_cpu_xor_2(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) | ||
615 | # endif | ||
616 | # ifndef irqsafe_cpu_xor_4 | ||
617 | # define irqsafe_cpu_xor_4(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) | ||
618 | # endif | ||
619 | # ifndef irqsafe_cpu_xor_8 | ||
620 | # define irqsafe_cpu_xor_8(pcp, val) irqsafe_cpu_generic_to_op((pcp), (val), ^=) | ||
621 | # endif | ||
622 | # define irqsafe_cpu_xor(pcp, val) __pcpu_size_call(irqsafe_cpu_xor_, (val)) | ||
623 | #endif | ||
624 | |||
246 | #endif /* __LINUX_PERCPU_H */ | 625 | #endif /* __LINUX_PERCPU_H */ |