lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 097/241] powerpc: Avoid taking a data miss on every userspace instruction miss
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/powerpc/mm/fault.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/arch/powerpc/mm/fault.c
    +++ b/arch/powerpc/mm/fault.c
    @@ -294,7 +294,7 @@ int do_page_fault(struct pt_regs *regs,
    * 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))

    \
     
     \ /
      Last update: 2018-03-19 20:37    [W:4.351 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site