diff options
Diffstat (limited to 'include/asm-generic/percpu.h')
-rw-r--r-- | include/asm-generic/percpu.h | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 8087b90d4673..04f91c2d3f7b 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h | |||
@@ -41,7 +41,11 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
41 | * Only S390 provides its own means of moving the pointer. | 41 | * Only S390 provides its own means of moving the pointer. |
42 | */ | 42 | */ |
43 | #ifndef SHIFT_PERCPU_PTR | 43 | #ifndef SHIFT_PERCPU_PTR |
44 | #define SHIFT_PERCPU_PTR(__p, __offset) RELOC_HIDE((__p), (__offset)) | 44 | /* Weird cast keeps both GCC and sparse happy. */ |
45 | #define SHIFT_PERCPU_PTR(__p, __offset) ({ \ | ||
46 | __verify_pcpu_ptr((__p)); \ | ||
47 | RELOC_HIDE((typeof(*(__p)) __kernel __force *)(__p), (__offset)); \ | ||
48 | }) | ||
45 | #endif | 49 | #endif |
46 | 50 | ||
47 | /* | 51 | /* |
@@ -50,11 +54,11 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
50 | * offset. | 54 | * offset. |
51 | */ | 55 | */ |
52 | #define per_cpu(var, cpu) \ | 56 | #define per_cpu(var, cpu) \ |
53 | (*SHIFT_PERCPU_PTR(&per_cpu_var(var), per_cpu_offset(cpu))) | 57 | (*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu))) |
54 | #define __get_cpu_var(var) \ | 58 | #define __get_cpu_var(var) \ |
55 | (*SHIFT_PERCPU_PTR(&per_cpu_var(var), my_cpu_offset)) | 59 | (*SHIFT_PERCPU_PTR(&(var), my_cpu_offset)) |
56 | #define __raw_get_cpu_var(var) \ | 60 | #define __raw_get_cpu_var(var) \ |
57 | (*SHIFT_PERCPU_PTR(&per_cpu_var(var), __my_cpu_offset)) | 61 | (*SHIFT_PERCPU_PTR(&(var), __my_cpu_offset)) |
58 | 62 | ||
59 | #define this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, my_cpu_offset) | 63 | #define this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, my_cpu_offset) |
60 | #define __this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset) | 64 | #define __this_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset) |
@@ -66,9 +70,9 @@ extern void setup_per_cpu_areas(void); | |||
66 | 70 | ||
67 | #else /* ! SMP */ | 71 | #else /* ! SMP */ |
68 | 72 | ||
69 | #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu_var(var))) | 73 | #define per_cpu(var, cpu) (*((void)(cpu), &(var))) |
70 | #define __get_cpu_var(var) per_cpu_var(var) | 74 | #define __get_cpu_var(var) (var) |
71 | #define __raw_get_cpu_var(var) per_cpu_var(var) | 75 | #define __raw_get_cpu_var(var) (var) |
72 | #define this_cpu_ptr(ptr) per_cpu_ptr(ptr, 0) | 76 | #define this_cpu_ptr(ptr) per_cpu_ptr(ptr, 0) |
73 | #define __this_cpu_ptr(ptr) this_cpu_ptr(ptr) | 77 | #define __this_cpu_ptr(ptr) this_cpu_ptr(ptr) |
74 | 78 | ||