• Thomas Gleixner's avatar
    x86/dumpstack/64: Speedup in_exception_stack() · c450c8f5
    Thomas Gleixner authored
    The current implementation of in_exception_stack() iterates over the
    exception stacks array. Most of the time this is an useless exercise, but
    even for the actual use cases (perf and ftrace) it takes at least 2
    iterations to get to the NMI stack.
    
    As the exception stacks and the guard pages are page aligned the loop can
    be avoided completely.
    
    Add a initial check whether the stack pointer is inside the full exception
    stack area and leave early if not.
    
    Create a lookup table which describes the stack area. The table index is
    the page offset from the beginning of the exception stacks. So for any
    given stack pointer the page offset is computed and a lookup in the
    description table is performed. If it is inside a guard page, return. If
    not, use the descriptor to fill in the info structure.
    
    The table is filled at compile time and for the !KASAN case the interesting
    page descriptors exactly fit into a single cache line. Just the last guard
    page descriptor is in the next cacheline, but that should not be accessed
    in the regular case.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Sean Christopherson <sean.j.christopherson@intel.com>
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20190414160145.543320386@linutronix.de
    c450c8f5
dumpstack_64.c 4.63 KB