lkml.org 
[lkml]   [2019]   [Dec]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v2 09/10] powerpc/vdso32: inline __get_datapage()
    Date
    __get_datapage() is only a few instructions to retrieve the
    address of the page where the kernel stores data to the VDSO.

    By inlining this function into its users, a bl/blr pair and
    a mflr/mtlr pair is avoided, plus a few reg moves.

    The improvement is noticeable (about 55 nsec/call on an 8xx)

    vdsotest before the patch:
    gettimeofday: vdso: 731 nsec/call
    clock-gettime-realtime-coarse: vdso: 668 nsec/call
    clock-gettime-monotonic-coarse: vdso: 745 nsec/call

    vdsotest after the patch:
    gettimeofday: vdso: 677 nsec/call
    clock-gettime-realtime-coarse: vdso: 613 nsec/call
    clock-gettime-monotonic-coarse: vdso: 690 nsec/call

    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>

    ---
    v3: define get_datapage macro in asm/vdso_datapage.h
    v4: fixed build failure with old binutils
    ---
    arch/powerpc/include/asm/vdso_datapage.h | 10 ++++++++++
    arch/powerpc/kernel/vdso32/cacheflush.S | 9 ++++-----
    arch/powerpc/kernel/vdso32/datapage.S | 28 +++-------------------------
    arch/powerpc/kernel/vdso32/gettimeofday.S | 12 +++++-------
    4 files changed, 22 insertions(+), 37 deletions(-)

    diff --git a/arch/powerpc/include/asm/vdso_datapage.h b/arch/powerpc/include/asm/vdso_datapage.h
    index 40f13f3626d3..ee5319a6f4e3 100644
    --- a/arch/powerpc/include/asm/vdso_datapage.h
    +++ b/arch/powerpc/include/asm/vdso_datapage.h
    @@ -118,6 +118,16 @@ struct vdso_data {

    extern struct vdso_data *vdso_data;

    +#else /* __ASSEMBLY__ */
    +
    +.macro get_datapage ptr, tmp
    + bcl 20, 31, .+4
    + mflr \ptr
    + addi \ptr, \ptr, (__kernel_datapage_offset - (.-4))@l
    + lwz \tmp, 0(\ptr)
    + add \ptr, \tmp, \ptr
    +.endm
    +
    #endif /* __ASSEMBLY__ */

    #endif /* __KERNEL__ */
    diff --git a/arch/powerpc/kernel/vdso32/cacheflush.S b/arch/powerpc/kernel/vdso32/cacheflush.S
    index 7f882e7b9f43..d178ec8c279d 100644
    --- a/arch/powerpc/kernel/vdso32/cacheflush.S
    +++ b/arch/powerpc/kernel/vdso32/cacheflush.S
    @@ -8,6 +8,7 @@
    #include <asm/processor.h>
    #include <asm/ppc_asm.h>
    #include <asm/vdso.h>
    +#include <asm/vdso_datapage.h>
    #include <asm/asm-offsets.h>

    .text
    @@ -24,14 +25,12 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache)
    .cfi_startproc
    mflr r12
    .cfi_register lr,r12
    - mr r11,r3
    - bl __get_datapage@local
    + get_datapage r10, r0
    mtlr r12
    - mr r10,r3

    lwz r7,CFG_DCACHE_BLOCKSZ(r10)
    addi r5,r7,-1
    - andc r6,r11,r5 /* round low to line bdy */
    + andc r6,r3,r5 /* round low to line bdy */
    subf r8,r6,r4 /* compute length */
    add r8,r8,r5 /* ensure we get enough */
    lwz r9,CFG_DCACHE_LOGBLOCKSZ(r10)
    @@ -48,7 +47,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache)

    lwz r7,CFG_ICACHE_BLOCKSZ(r10)
    addi r5,r7,-1
    - andc r6,r11,r5 /* round low to line bdy */
    + andc r6,r3,r5 /* round low to line bdy */
    subf r8,r6,r4 /* compute length */
    add r8,r8,r5
    lwz r9,CFG_ICACHE_LOGBLOCKSZ(r10)
    diff --git a/arch/powerpc/kernel/vdso32/datapage.S b/arch/powerpc/kernel/vdso32/datapage.S
    index 6c7401bd284e..1095d818f94a 100644
    --- a/arch/powerpc/kernel/vdso32/datapage.S
    +++ b/arch/powerpc/kernel/vdso32/datapage.S
    @@ -10,35 +10,13 @@
    #include <asm/asm-offsets.h>
    #include <asm/unistd.h>
    #include <asm/vdso.h>
    +#include <asm/vdso_datapage.h>

    .text
    .global __kernel_datapage_offset;
    __kernel_datapage_offset:
    .long 0

    -V_FUNCTION_BEGIN(__get_datapage)
    - .cfi_startproc
    - /* We don't want that exposed or overridable as we want other objects
    - * to be able to bl directly to here
    - */
    - .protected __get_datapage
    - .hidden __get_datapage
    -
    - mflr r0
    - .cfi_register lr,r0
    -
    - bcl 20,31,data_page_branch
    -data_page_branch:
    - mflr r3
    - mtlr r0
    - addi r3, r3, __kernel_datapage_offset-data_page_branch
    - lwz r0,0(r3)
    - .cfi_restore lr
    - add r3,r0,r3
    - blr
    - .cfi_endproc
    -V_FUNCTION_END(__get_datapage)
    -
    /*
    * void *__kernel_get_syscall_map(unsigned int *syscall_count) ;
    *
    @@ -53,7 +31,7 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
    mflr r12
    .cfi_register lr,r12
    mr r4,r3
    - bl __get_datapage@local
    + get_datapage r3, r0
    mtlr r12
    addi r3,r3,CFG_SYSCALL_MAP32
    cmpli cr0,r4,0
    @@ -75,7 +53,7 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
    .cfi_startproc
    mflr r12
    .cfi_register lr,r12
    - bl __get_datapage@local
    + get_datapage r3, r0
    lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
    lwz r3,CFG_TB_TICKS_PER_SEC(r3)
    mtlr r12
    diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S
    index 3306672f57a9..d6c1d331e8cb 100644
    --- a/arch/powerpc/kernel/vdso32/gettimeofday.S
    +++ b/arch/powerpc/kernel/vdso32/gettimeofday.S
    @@ -9,6 +9,7 @@
    #include <asm/processor.h>
    #include <asm/ppc_asm.h>
    #include <asm/vdso.h>
    +#include <asm/vdso_datapage.h>
    #include <asm/asm-offsets.h>
    #include <asm/unistd.h>

    @@ -33,8 +34,7 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)

    mr r10,r3 /* r10 saves tv */
    mr r11,r4 /* r11 saves tz */
    - bl __get_datapage@local /* get data page */
    - mr r9, r3 /* datapage ptr in r9 */
    + get_datapage r9, r0
    cmplwi r10,0 /* check if tv is NULL */
    beq 3f
    lis r7,1000000@ha /* load up USEC_PER_SEC */
    @@ -74,8 +74,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
    mflr r12 /* r12 saves lr */
    .cfi_register lr,r12
    mr r11,r4 /* r11 saves tp */
    - bl __get_datapage@local /* get data page */
    - mr r9,r3 /* datapage ptr in r9 */
    + get_datapage r9, r0
    lis r7,NSEC_PER_SEC@h /* want nanoseconds */
    ori r7,r7,NSEC_PER_SEC@l
    50: bl __do_get_tspec@local /* get sec/nsec from tb & kernel */
    @@ -156,7 +155,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)

    mflr r12
    .cfi_register lr,r12
    - bl __get_datapage@local /* get data page */
    + get_datapage r3, r0
    lwz r5, CLOCK_HRTIMER_RES(r3)
    mtlr r12
    li r3,0
    @@ -190,8 +189,7 @@ V_FUNCTION_BEGIN(__kernel_time)
    .cfi_register lr,r12

    mr r11,r3 /* r11 holds t */
    - bl __get_datapage@local
    - mr r9, r3 /* datapage ptr in r9 */
    + get_datapage r9, r0

    lwz r3,STAMP_XTIME_SEC+LOPART(r9)

    --
    2.13.3
    \
     
     \ /
      Last update: 2019-12-23 15:32    [W:4.488 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site