Messages in this thread | | | Date | Tue, 26 Jan 2010 03:18:48 +0100 | From | Frederic Weisbecker <> | Subject | Re: [PATCH 7/8] percpu: add __percpu sparse annotations to hw_breakpoint |
| |
On Tue, Jan 26, 2010 at 11:13:59AM +0900, Tejun Heo wrote: > Hello, > > On 01/26/2010 11:01 AM, Frederic Weisbecker wrote: > > So, may be it considers you are applying the address space overriding > > to the pointer to the type and not to the type itself. > > > > Consider: > > > > int __percpu i; > > > > What you do above *might* be considered as if SHIFT_PERCPU_PTR > > returns something of a type: > > > > int * __percpu i; > > > > So the pointer is in the normal address space, but its content is in > > __percpu address space. > > > > What if you do this: > > > > > > #define SHIFT_PERCPU_PTR(__p, __offset) ({ \ > > __verify_pcpu_ptr((__p)); \ > > RELOC_HIDE((__p), (__offset)); \ > > }) > > > > #define per_cpu(var, cpu) \ > > (typeof(var) __kernel __force)(*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu))) > > arch/x86/kernel/cpu/common.c:1149:20: warning: cast to non-scalar > arch/x86/kernel/cpu/common.c:1149:20: error: strange non-value function or array > CC arch/x86/kernel/cpu/common.o > arch/x86/kernel/cpu/common.c: In function 'cpu_init': > arch/x86/kernel/cpu/common.c:1149: error: cast specifies array type > > Can't cast that way. :-(
What about this? It doesn't use direct cast to scalar but should create a pointer type to kernel space datas:
#define kernel_space_t(var) \ (typeof(var) __kernel __force)
#define SHIFT_PERCPU_PTR(__p, __offset) ({ \ __verify_pcpu_ptr((__p)); \ RELOC_HIDE((typeof(*(kernel_space_t(var)) __kernel __force *)(__p), (__offset)); \ })
#define per_cpu(var, cpu) \ (*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu)))
| |