mirror of https://gitee.com/openkylin/linux.git
percpu: make x86 addr <-> pcpu ptr conversion macros generic
Impact: generic addr <-> pcpu ptr conversion macros There's nothing arch specific about x86 __addr_to_pcpu_ptr() and __pcpu_ptr_to_addr(). With proper __per_cpu_load and __per_cpu_start defined, they'll do the right thing regardless of actual layout. Move these macros from arch/x86/include/asm/percpu.h to mm/percpu.c and allow archs to override it as necessary. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
19390c4d03
commit
e01009833e
|
@ -43,14 +43,6 @@
|
|||
#else /* ...!ASSEMBLY */
|
||||
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
#define __addr_to_pcpu_ptr(addr) \
|
||||
(void *)((unsigned long)(addr) - (unsigned long)pcpu_base_addr \
|
||||
+ (unsigned long)__per_cpu_start)
|
||||
#define __pcpu_ptr_to_addr(ptr) \
|
||||
(void *)((unsigned long)(ptr) + (unsigned long)pcpu_base_addr \
|
||||
- (unsigned long)__per_cpu_start)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define __percpu_arg(x) "%%"__stringify(__percpu_seg)":%P" #x
|
||||
|
|
16
mm/percpu.c
16
mm/percpu.c
|
@ -46,7 +46,8 @@
|
|||
* - define CONFIG_HAVE_DYNAMIC_PER_CPU_AREA
|
||||
*
|
||||
* - define __addr_to_pcpu_ptr() and __pcpu_ptr_to_addr() to translate
|
||||
* regular address to percpu pointer and back
|
||||
* regular address to percpu pointer and back if they need to be
|
||||
* different from the default
|
||||
*
|
||||
* - use pcpu_setup_first_chunk() during percpu area initialization to
|
||||
* setup the first chunk containing the kernel static percpu area
|
||||
|
@ -67,11 +68,24 @@
|
|||
#include <linux/workqueue.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
#define PCPU_SLOT_BASE_SHIFT 5 /* 1-31 shares the same slot */
|
||||
#define PCPU_DFL_MAP_ALLOC 16 /* start a map with 16 ents */
|
||||
|
||||
/* default addr <-> pcpu_ptr mapping, override in asm/percpu.h if necessary */
|
||||
#ifndef __addr_to_pcpu_ptr
|
||||
#define __addr_to_pcpu_ptr(addr) \
|
||||
(void *)((unsigned long)(addr) - (unsigned long)pcpu_base_addr \
|
||||
+ (unsigned long)__per_cpu_start)
|
||||
#endif
|
||||
#ifndef __pcpu_ptr_to_addr
|
||||
#define __pcpu_ptr_to_addr(ptr) \
|
||||
(void *)((unsigned long)(ptr) + (unsigned long)pcpu_base_addr \
|
||||
- (unsigned long)__per_cpu_start)
|
||||
#endif
|
||||
|
||||
struct pcpu_chunk {
|
||||
struct list_head list; /* linked to pcpu_slot lists */
|
||||
struct rb_node rb_node; /* key is chunk->vm->addr */
|
||||
|
|
Loading…
Reference in New Issue