lkml.org 
[lkml]   [2009]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/5] percpu: make x86 addr <-> pcpu ptr conversion macros generic
    Date
    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>
    ---
    arch/x86/include/asm/percpu.h | 8 --------
    mm/percpu.c | 16 +++++++++++++++-
    2 files changed, 15 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
    index 8f1d2fb..aee103b 100644
    --- a/arch/x86/include/asm/percpu.h
    +++ b/arch/x86/include/asm/percpu.h
    @@ -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
    diff --git a/mm/percpu.c b/mm/percpu.c
    index bfe6a3a..c6f38a2 100644
    --- a/mm/percpu.c
    +++ b/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 */
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2009-03-10 09:01    [W:0.024 / U:0.248 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site