This source file includes following definitions.
- __this_cpu_preempt_check
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifndef _LINUX_PERCPU_DEFS_H
18 #define _LINUX_PERCPU_DEFS_H
19
20 #ifdef CONFIG_SMP
21
22 #ifdef MODULE
23 #define PER_CPU_SHARED_ALIGNED_SECTION ""
24 #define PER_CPU_ALIGNED_SECTION ""
25 #else
26 #define PER_CPU_SHARED_ALIGNED_SECTION "..shared_aligned"
27 #define PER_CPU_ALIGNED_SECTION "..shared_aligned"
28 #endif
29 #define PER_CPU_FIRST_SECTION "..first"
30
31 #else
32
33 #define PER_CPU_SHARED_ALIGNED_SECTION ""
34 #define PER_CPU_ALIGNED_SECTION "..shared_aligned"
35 #define PER_CPU_FIRST_SECTION ""
36
37 #endif
38
39
40
41
42
43
44
45
46
47
48
49 #define __PCPU_ATTRS(sec) \
50 __percpu __attribute__((section(PER_CPU_BASE_SECTION sec))) \
51 PER_CPU_ATTRIBUTES
52
53 #define __PCPU_DUMMY_ATTRS \
54 __attribute__((section(".discard"), unused))
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 #if defined(ARCH_NEEDS_WEAK_PER_CPU) || defined(CONFIG_DEBUG_FORCE_WEAK_PER_CPU)
76
77
78
79
80
81
82
83
84
85
86 #define DECLARE_PER_CPU_SECTION(type, name, sec) \
87 extern __PCPU_DUMMY_ATTRS char __pcpu_scope_##name; \
88 extern __PCPU_ATTRS(sec) __typeof__(type) name
89
90 #define DEFINE_PER_CPU_SECTION(type, name, sec) \
91 __PCPU_DUMMY_ATTRS char __pcpu_scope_##name; \
92 extern __PCPU_DUMMY_ATTRS char __pcpu_unique_##name; \
93 __PCPU_DUMMY_ATTRS char __pcpu_unique_##name; \
94 extern __PCPU_ATTRS(sec) __typeof__(type) name; \
95 __PCPU_ATTRS(sec) __weak __typeof__(type) name
96 #else
97
98
99
100 #define DECLARE_PER_CPU_SECTION(type, name, sec) \
101 extern __PCPU_ATTRS(sec) __typeof__(type) name
102
103 #define DEFINE_PER_CPU_SECTION(type, name, sec) \
104 __PCPU_ATTRS(sec) __typeof__(type) name
105 #endif
106
107
108
109
110
111 #define DECLARE_PER_CPU(type, name) \
112 DECLARE_PER_CPU_SECTION(type, name, "")
113
114 #define DEFINE_PER_CPU(type, name) \
115 DEFINE_PER_CPU_SECTION(type, name, "")
116
117
118
119
120
121 #define DECLARE_PER_CPU_FIRST(type, name) \
122 DECLARE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION)
123
124 #define DEFINE_PER_CPU_FIRST(type, name) \
125 DEFINE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION)
126
127
128
129
130
131
132
133
134
135
136
137
138 #define DECLARE_PER_CPU_SHARED_ALIGNED(type, name) \
139 DECLARE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \
140 ____cacheline_aligned_in_smp
141
142 #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \
143 DEFINE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \
144 ____cacheline_aligned_in_smp
145
146 #define DECLARE_PER_CPU_ALIGNED(type, name) \
147 DECLARE_PER_CPU_SECTION(type, name, PER_CPU_ALIGNED_SECTION) \
148 ____cacheline_aligned
149
150 #define DEFINE_PER_CPU_ALIGNED(type, name) \
151 DEFINE_PER_CPU_SECTION(type, name, PER_CPU_ALIGNED_SECTION) \
152 ____cacheline_aligned
153
154
155
156
157 #define DECLARE_PER_CPU_PAGE_ALIGNED(type, name) \
158 DECLARE_PER_CPU_SECTION(type, name, "..page_aligned") \
159 __aligned(PAGE_SIZE)
160
161 #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
162 DEFINE_PER_CPU_SECTION(type, name, "..page_aligned") \
163 __aligned(PAGE_SIZE)
164
165
166
167
168 #define DECLARE_PER_CPU_READ_MOSTLY(type, name) \
169 DECLARE_PER_CPU_SECTION(type, name, "..read_mostly")
170
171 #define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
172 DEFINE_PER_CPU_SECTION(type, name, "..read_mostly")
173
174
175
176
177
178 #ifdef CONFIG_AMD_MEM_ENCRYPT
179 #define DECLARE_PER_CPU_DECRYPTED(type, name) \
180 DECLARE_PER_CPU_SECTION(type, name, "..decrypted")
181
182 #define DEFINE_PER_CPU_DECRYPTED(type, name) \
183 DEFINE_PER_CPU_SECTION(type, name, "..decrypted")
184 #else
185 #define DEFINE_PER_CPU_DECRYPTED(type, name) DEFINE_PER_CPU(type, name)
186 #endif
187
188
189
190
191
192
193 #ifndef __CHECKER__
194 #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var)
195 #define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var)
196 #else
197 #define EXPORT_PER_CPU_SYMBOL(var)
198 #define EXPORT_PER_CPU_SYMBOL_GPL(var)
199 #endif
200
201
202
203
204 #ifndef __ASSEMBLY__
205
206
207
208
209
210
211
212
213
214
215
216
217 #define __verify_pcpu_ptr(ptr) \
218 do { \
219 const void __percpu *__vpp_verify = (typeof((ptr) + 0))NULL; \
220 (void)__vpp_verify; \
221 } while (0)
222
223 #ifdef CONFIG_SMP
224
225
226
227
228
229
230 #define SHIFT_PERCPU_PTR(__p, __offset) \
231 RELOC_HIDE((typeof(*(__p)) __kernel __force *)(__p), (__offset))
232
233 #define per_cpu_ptr(ptr, cpu) \
234 ({ \
235 __verify_pcpu_ptr(ptr); \
236 SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu))); \
237 })
238
239 #define raw_cpu_ptr(ptr) \
240 ({ \
241 __verify_pcpu_ptr(ptr); \
242 arch_raw_cpu_ptr(ptr); \
243 })
244
245 #ifdef CONFIG_DEBUG_PREEMPT
246 #define this_cpu_ptr(ptr) \
247 ({ \
248 __verify_pcpu_ptr(ptr); \
249 SHIFT_PERCPU_PTR(ptr, my_cpu_offset); \
250 })
251 #else
252 #define this_cpu_ptr(ptr) raw_cpu_ptr(ptr)
253 #endif
254
255 #else
256
257 #define VERIFY_PERCPU_PTR(__p) \
258 ({ \
259 __verify_pcpu_ptr(__p); \
260 (typeof(*(__p)) __kernel __force *)(__p); \
261 })
262
263 #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); VERIFY_PERCPU_PTR(ptr); })
264 #define raw_cpu_ptr(ptr) per_cpu_ptr(ptr, 0)
265 #define this_cpu_ptr(ptr) raw_cpu_ptr(ptr)
266
267 #endif
268
269 #define per_cpu(var, cpu) (*per_cpu_ptr(&(var), cpu))
270
271
272
273
274
275 #define get_cpu_var(var) \
276 (*({ \
277 preempt_disable(); \
278 this_cpu_ptr(&var); \
279 }))
280
281
282
283
284
285 #define put_cpu_var(var) \
286 do { \
287 (void)&(var); \
288 preempt_enable(); \
289 } while (0)
290
291 #define get_cpu_ptr(var) \
292 ({ \
293 preempt_disable(); \
294 this_cpu_ptr(var); \
295 })
296
297 #define put_cpu_ptr(var) \
298 do { \
299 (void)(var); \
300 preempt_enable(); \
301 } while (0)
302
303
304
305
306
307
308 extern void __bad_size_call_parameter(void);
309
310 #ifdef CONFIG_DEBUG_PREEMPT
311 extern void __this_cpu_preempt_check(const char *op);
312 #else
313 static inline void __this_cpu_preempt_check(const char *op) { }
314 #endif
315
316 #define __pcpu_size_call_return(stem, variable) \
317 ({ \
318 typeof(variable) pscr_ret__; \
319 __verify_pcpu_ptr(&(variable)); \
320 switch(sizeof(variable)) { \
321 case 1: pscr_ret__ = stem##1(variable); break; \
322 case 2: pscr_ret__ = stem##2(variable); break; \
323 case 4: pscr_ret__ = stem##4(variable); break; \
324 case 8: pscr_ret__ = stem##8(variable); break; \
325 default: \
326 __bad_size_call_parameter(); break; \
327 } \
328 pscr_ret__; \
329 })
330
331 #define __pcpu_size_call_return2(stem, variable, ...) \
332 ({ \
333 typeof(variable) pscr2_ret__; \
334 __verify_pcpu_ptr(&(variable)); \
335 switch(sizeof(variable)) { \
336 case 1: pscr2_ret__ = stem##1(variable, __VA_ARGS__); break; \
337 case 2: pscr2_ret__ = stem##2(variable, __VA_ARGS__); break; \
338 case 4: pscr2_ret__ = stem##4(variable, __VA_ARGS__); break; \
339 case 8: pscr2_ret__ = stem##8(variable, __VA_ARGS__); break; \
340 default: \
341 __bad_size_call_parameter(); break; \
342 } \
343 pscr2_ret__; \
344 })
345
346
347
348
349
350
351
352
353
354 #define __pcpu_double_call_return_bool(stem, pcp1, pcp2, ...) \
355 ({ \
356 bool pdcrb_ret__; \
357 __verify_pcpu_ptr(&(pcp1)); \
358 BUILD_BUG_ON(sizeof(pcp1) != sizeof(pcp2)); \
359 VM_BUG_ON((unsigned long)(&(pcp1)) % (2 * sizeof(pcp1))); \
360 VM_BUG_ON((unsigned long)(&(pcp2)) != \
361 (unsigned long)(&(pcp1)) + sizeof(pcp1)); \
362 switch(sizeof(pcp1)) { \
363 case 1: pdcrb_ret__ = stem##1(pcp1, pcp2, __VA_ARGS__); break; \
364 case 2: pdcrb_ret__ = stem##2(pcp1, pcp2, __VA_ARGS__); break; \
365 case 4: pdcrb_ret__ = stem##4(pcp1, pcp2, __VA_ARGS__); break; \
366 case 8: pdcrb_ret__ = stem##8(pcp1, pcp2, __VA_ARGS__); break; \
367 default: \
368 __bad_size_call_parameter(); break; \
369 } \
370 pdcrb_ret__; \
371 })
372
373 #define __pcpu_size_call(stem, variable, ...) \
374 do { \
375 __verify_pcpu_ptr(&(variable)); \
376 switch(sizeof(variable)) { \
377 case 1: stem##1(variable, __VA_ARGS__);break; \
378 case 2: stem##2(variable, __VA_ARGS__);break; \
379 case 4: stem##4(variable, __VA_ARGS__);break; \
380 case 8: stem##8(variable, __VA_ARGS__);break; \
381 default: \
382 __bad_size_call_parameter();break; \
383 } \
384 } while (0)
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420 #define raw_cpu_read(pcp) __pcpu_size_call_return(raw_cpu_read_, pcp)
421 #define raw_cpu_write(pcp, val) __pcpu_size_call(raw_cpu_write_, pcp, val)
422 #define raw_cpu_add(pcp, val) __pcpu_size_call(raw_cpu_add_, pcp, val)
423 #define raw_cpu_and(pcp, val) __pcpu_size_call(raw_cpu_and_, pcp, val)
424 #define raw_cpu_or(pcp, val) __pcpu_size_call(raw_cpu_or_, pcp, val)
425 #define raw_cpu_add_return(pcp, val) __pcpu_size_call_return2(raw_cpu_add_return_, pcp, val)
426 #define raw_cpu_xchg(pcp, nval) __pcpu_size_call_return2(raw_cpu_xchg_, pcp, nval)
427 #define raw_cpu_cmpxchg(pcp, oval, nval) \
428 __pcpu_size_call_return2(raw_cpu_cmpxchg_, pcp, oval, nval)
429 #define raw_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \
430 __pcpu_double_call_return_bool(raw_cpu_cmpxchg_double_, pcp1, pcp2, oval1, oval2, nval1, nval2)
431
432 #define raw_cpu_sub(pcp, val) raw_cpu_add(pcp, -(val))
433 #define raw_cpu_inc(pcp) raw_cpu_add(pcp, 1)
434 #define raw_cpu_dec(pcp) raw_cpu_sub(pcp, 1)
435 #define raw_cpu_sub_return(pcp, val) raw_cpu_add_return(pcp, -(typeof(pcp))(val))
436 #define raw_cpu_inc_return(pcp) raw_cpu_add_return(pcp, 1)
437 #define raw_cpu_dec_return(pcp) raw_cpu_add_return(pcp, -1)
438
439
440
441
442
443 #define __this_cpu_read(pcp) \
444 ({ \
445 __this_cpu_preempt_check("read"); \
446 raw_cpu_read(pcp); \
447 })
448
449 #define __this_cpu_write(pcp, val) \
450 ({ \
451 __this_cpu_preempt_check("write"); \
452 raw_cpu_write(pcp, val); \
453 })
454
455 #define __this_cpu_add(pcp, val) \
456 ({ \
457 __this_cpu_preempt_check("add"); \
458 raw_cpu_add(pcp, val); \
459 })
460
461 #define __this_cpu_and(pcp, val) \
462 ({ \
463 __this_cpu_preempt_check("and"); \
464 raw_cpu_and(pcp, val); \
465 })
466
467 #define __this_cpu_or(pcp, val) \
468 ({ \
469 __this_cpu_preempt_check("or"); \
470 raw_cpu_or(pcp, val); \
471 })
472
473 #define __this_cpu_add_return(pcp, val) \
474 ({ \
475 __this_cpu_preempt_check("add_return"); \
476 raw_cpu_add_return(pcp, val); \
477 })
478
479 #define __this_cpu_xchg(pcp, nval) \
480 ({ \
481 __this_cpu_preempt_check("xchg"); \
482 raw_cpu_xchg(pcp, nval); \
483 })
484
485 #define __this_cpu_cmpxchg(pcp, oval, nval) \
486 ({ \
487 __this_cpu_preempt_check("cmpxchg"); \
488 raw_cpu_cmpxchg(pcp, oval, nval); \
489 })
490
491 #define __this_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \
492 ({ __this_cpu_preempt_check("cmpxchg_double"); \
493 raw_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2); \
494 })
495
496 #define __this_cpu_sub(pcp, val) __this_cpu_add(pcp, -(typeof(pcp))(val))
497 #define __this_cpu_inc(pcp) __this_cpu_add(pcp, 1)
498 #define __this_cpu_dec(pcp) __this_cpu_sub(pcp, 1)
499 #define __this_cpu_sub_return(pcp, val) __this_cpu_add_return(pcp, -(typeof(pcp))(val))
500 #define __this_cpu_inc_return(pcp) __this_cpu_add_return(pcp, 1)
501 #define __this_cpu_dec_return(pcp) __this_cpu_add_return(pcp, -1)
502
503
504
505
506
507 #define this_cpu_read(pcp) __pcpu_size_call_return(this_cpu_read_, pcp)
508 #define this_cpu_write(pcp, val) __pcpu_size_call(this_cpu_write_, pcp, val)
509 #define this_cpu_add(pcp, val) __pcpu_size_call(this_cpu_add_, pcp, val)
510 #define this_cpu_and(pcp, val) __pcpu_size_call(this_cpu_and_, pcp, val)
511 #define this_cpu_or(pcp, val) __pcpu_size_call(this_cpu_or_, pcp, val)
512 #define this_cpu_add_return(pcp, val) __pcpu_size_call_return2(this_cpu_add_return_, pcp, val)
513 #define this_cpu_xchg(pcp, nval) __pcpu_size_call_return2(this_cpu_xchg_, pcp, nval)
514 #define this_cpu_cmpxchg(pcp, oval, nval) \
515 __pcpu_size_call_return2(this_cpu_cmpxchg_, pcp, oval, nval)
516 #define this_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \
517 __pcpu_double_call_return_bool(this_cpu_cmpxchg_double_, pcp1, pcp2, oval1, oval2, nval1, nval2)
518
519 #define this_cpu_sub(pcp, val) this_cpu_add(pcp, -(typeof(pcp))(val))
520 #define this_cpu_inc(pcp) this_cpu_add(pcp, 1)
521 #define this_cpu_dec(pcp) this_cpu_sub(pcp, 1)
522 #define this_cpu_sub_return(pcp, val) this_cpu_add_return(pcp, -(typeof(pcp))(val))
523 #define this_cpu_inc_return(pcp) this_cpu_add_return(pcp, 1)
524 #define this_cpu_dec_return(pcp) this_cpu_add_return(pcp, -1)
525
526 #endif
527 #endif