Improve alloc_percpu: __get_cpu_ptr/get_cpu_ptr/put_cpu_ptr
PATCH 6/7 Improve alloc_percpu: __get_cpu_ptr/get_cpu_ptr/put_cpu_ptr
Now we have a decent implementation it makes sense to have an interface for "this cpu", analogous to __get_cpu_var.
Alpha is untested.
Signed-off-by Rusty Russell <[email protected]>
Cc Christoph Lameter <[email protected]>
--- arch/alpha/include/asm/percpu.h | 10 ++++++++++ include/asm-generic/percpu.h | 11 +++++++++++ include/linux/percpu.h | 16 ++++++++++++++++ 3 files changed, 37 insertions(+)
arch/alpha/include/asm/percpu.h +10 -0
@@ -62,8 +62,16 @@ (*SHIFT_PERCPU_PTR(var, my_cpu_offset))#define __raw_get_cpu_var (var) \ (*SHIFT_PERCPU_PTR(var, __my_cpu_offset)) +#define __get_cpu_ptr (ptr) \ + RELOC_HIDE(ptr, my_cpu_offset) +#define __raw_get_cpu_ptr (ptr) \ + RELOC_HIDE(ptr, __my_cpu_offset)#define per_cpu_ptr (ptr, cpu) \ RELOC_HIDE((ptr), (per_cpu_offset(cpu))) +#define __get_cpu_ptr (ptr) \ + RELOC_HIDE(ptr, my_cpu_offset) +#define __raw_get_cpu_ptr (ptr) \ + RELOC_HIDE(ptr, __my_cpu_offset)#else /* ! SMP */
@@ -71,6 +79,8 @@#define __get_cpu_var (var) per_cpu_var(var)#define __raw_get_cpu_var (var) per_cpu_var(var)#define per_cpu_ptr (ptr, cpu) (ptr) +#define __get_cpu_ptr (ptr) (ptr) +#define __raw_get_cpu_ptr (ptr) (ptr)#define PER_CPU_ATTRIBUTES
include/asm-generic/percpu.h +11 -0
@@ -72,6 +72,15 @@#define per_cpu_ptr (ptr, cpu) \ RELOC_HIDE((ptr), (per_cpu_offset(cpu))) +/** +* __get_cpu_ptr - get a pointer to this cpu's allocated memory +* @ptr: the pointer returned from alloc_percpu +* +* Similar to __get_cpu_var(), except for dynamic memory. +*/ +#define __get_cpu_ptr (ptr) RELOC_HIDE(ptr, my_cpu_offset) +#define __raw_get_cpu_ptr (ptr) RELOC_HIDE(ptr, __my_cpu_offset) +#ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA extern void setup_per_cpu_areas (void );#endif
@@ -82,6 +91,8 @@#define __get_cpu_var (var) per_cpu_var(var)#define __raw_get_cpu_var (var) per_cpu_var(var)#define per_cpu_ptr (ptr, cpu) (ptr) +#define __get_cpu_ptr (ptr) (ptr) +#define __raw_get_cpu_ptr (ptr) (ptr)#endif /* SMP */
include/linux/percpu.h +16 -0
@@ -57,6 +57,22 @@ &__get_cpu_var(var); }))#define put_cpu_var (var) preempt_enable() +/** +* put_cpu_ptr - return a pointer to this cpu's allocated memory +* @ptr: the pointer passed to get_cpu_ptr(). +* +* Counterpart to get_cpu_ptr(): re-enables preemption +*/ +#define put_cpu_ptr (ptr) preempt_enable() + +/** +* get_cpu_ptr - hold a pointer to this cpu's allocated memory +* @ptr: the pointer returned from alloc_percpu +* +* Similar to get_cpu_var(), except for dynamic memory. Disabled preemption. +*/ +#define get_cpu_ptr (ptr) ({ preempt_disable(); __get_cpu_ptr(ptr); }) +#ifdef CONFIG_SMP void *__alloc_percpu (unsigned long size,unsigned long align);void free_percpu (void *pcpuptr);