lkml.org 
[lkml]   [2018]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 100/219] powerpc: Avoid taking a data miss on every userspace instruction miss
    Date
    From: Anton Blanchard <anton@samba.org>

    [ Upstream commit a7a9dcd882a67b68568868b988289fce5ffd8419 ]

    Early on in do_page_fault() we call store_updates_sp(), regardless of
    the type of exception. For an instruction miss this doesn't make
    sense, because we only use this information to detect if a data miss
    is the result of a stack expansion instruction or not.

    Worse still, it results in a data miss within every userspace
    instruction miss handler, because we try and load the very instruction
    we are about to install a pte for!

    A simple exec microbenchmark runs 6% faster on POWER8 with this fix:

    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>

    int main(int argc, char *argv[])
    {
    unsigned long left = atol(argv[1]);
    char leftstr[16];

    if (left-- == 0)
    return 0;

    sprintf(leftstr, "%ld", left);
    execlp(argv[0], argv[0], leftstr, NULL);
    perror("exec failed\n");

    return 0;
    }

    Pass the number of iterations on the command line (eg 10000) and time
    how long it takes to execute.

    Signed-off-by: Anton Blanchard <anton@samba.org>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    arch/powerpc/mm/fault.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
    index d0b137d96df1..9376e8e53bfa 100644
    --- a/arch/powerpc/mm/fault.c
    +++ b/arch/powerpc/mm/fault.c
    @@ -294,7 +294,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
    * can result in fault, which will cause a deadlock when called with
    * mmap_sem held
    */
    - if (user_mode(regs))
    + if (!is_exec && user_mode(regs))
    store_update_sp = store_updates_sp(regs);

    if (user_mode(regs))
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-04 00:50    [W:2.363 / U:0.340 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site