• Josh Poimboeuf's avatar
    x86/entry: Fix the end of the stack for newly forked tasks · ff3f7e24
    Josh Poimboeuf authored
    When unwinding a task, the end of the stack is always at the same offset
    right below the saved pt_regs, regardless of which syscall was used to
    enter the kernel.  That convention allows the unwinder to verify that a
    stack is sane.
    
    However, newly forked tasks don't always follow that convention, as
    reported by the following unwinder warning seen by Dave Jones:
    
      WARNING: kernel stack frame pointer at ffffc90001443f30 in kworker/u8:8:30468 has bad value           (null)
    
    The warning was due to the following call chain:
    
      (ftrace handler)
      call_usermodehelper_exec_async+0x5/0x140
      ret_from_fork+0x22/0x30
    
    The problem is that ret_from_fork() doesn't create a stack frame before
    calling other functions.  Fix that by carefully using the frame pointer
    macros.
    
    In addition to conforming to the end of stack convention, this also
    makes related stack traces more sensible by making it clear to the user
    that ret_from_fork() was involved.
    Reported-by: default avatarDave Jones <davej@codemonkey.org.uk>
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Miroslav Benes <mbenes@suse.cz>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/8854cdaab980e9700a81e9ebf0d4238e4bbb68ef.1483978430.git.jpoimboe@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    ff3f7e24
entry_64.S 42.6 KB