diff options
Diffstat (limited to 'include/asm-generic/percpu.h')
-rw-r--r-- | include/asm-generic/percpu.h | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 90079c373f1c..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,14 @@ 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)) |
62 | |||
63 | #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) | ||
58 | 65 | ||
59 | 66 | ||
60 | #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA | 67 | #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA |
@@ -63,9 +70,11 @@ extern void setup_per_cpu_areas(void); | |||
63 | 70 | ||
64 | #else /* ! SMP */ | 71 | #else /* ! SMP */ |
65 | 72 | ||
66 | #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu_var(var))) | 73 | #define per_cpu(var, cpu) (*((void)(cpu), &(var))) |
67 | #define __get_cpu_var(var) per_cpu_var(var) | 74 | #define __get_cpu_var(var) (var) |
68 | #define __raw_get_cpu_var(var) per_cpu_var(var) | 75 | #define __raw_get_cpu_var(var) (var) |
76 | #define this_cpu_ptr(ptr) per_cpu_ptr(ptr, 0) | ||
77 | #define __this_cpu_ptr(ptr) this_cpu_ptr(ptr) | ||
69 | 78 | ||
70 | #endif /* SMP */ | 79 | #endif /* SMP */ |
71 | 80 | ||