• Frederic Weisbecker's avatar
    x86: Fixup wrong debug exception frame link in stacktraces · b625b3b3
    Frederic Weisbecker authored
    While dumping a stacktrace, the end of the exception stack won't link
    the frame pointer to the previous stack.
    
    The interrupted stack will then be considered as unreliable and ignored
    by perf, as the frame pointer is unreliable itself.
    
    This happens because we overwrite the frame pointer that links to the
    interrupted frame with the address of the exception stack. This is
    done in order to reserve space inside.
    But rbp has been chosen here only because it is not a scratch register,
    so that the address of the exception stack remains in rbp after calling
    do_debug(), we can then release the exception stack space without the
    need to retrieve its address again.
    
    But we can pick another non-scratch register to do that, so that we
    preserve the link to the interrupted stack frame in the stacktraces.
    
    Just randomly choose r12. Every registers are saved just before and
    restored just after calling do_debug(). And r12 is not used in the
    middle, which makes it a perfect candidate.
    
    Example: perf record -g -a -c 1 -f -e mem:$(tasklist_lock_addr):rw
    
    Before:
        44.18%  [k] _raw_read_lock
                |
                |
                ---  |--6.31%-- waitid
                     |
                     |--4.26%-- writev
                     |
                     |--3.63%-- __select
                     |
                     |--3.15%-- __waitpid
                     |          |
                     |          |--28.57%-- 0x8b52e00000139f
                     |          |
                     |          |--28.57%-- 0x8b52e0000013c6
                     |          |
                     |          |--14.29%-- 0x7fde786dc000
                     |          |
                     |          |--14.29%-- 0x62696c2f7273752f
                     |          |
                     |           --14.29%-- 0x1ea9df800000000
                     |
                     |--3.00%-- __poll
    
    After:
    
        43.94%  [k] _raw_read_lock
                |
                --- _read_lock
                   |
                   |--60.53%-- send_sigio
                   |          __kill_fasync
                   |          kill_fasync
                   |          evdev_pass_event
                   |          evdev_event
                   |          input_pass_event
                   |          input_handle_event
                   |          input_event
                   |          synaptics_process_byte
                   |          psmouse_handle_byte
                   |          psmouse_interrupt
                   |          serio_interrupt
                   |          i8042_interrupt
                   |          handle_IRQ_event
                   |          handle_edge_irq
                   |          handle_irq
                   |          __irqentry_text_start
                   |          ret_from_intr
                   |          |
                   |          |--30.43%-- __select
                   |          |
                   |          |--17.39%-- 0x454f15
                   |          |
                   |          |--13.04%-- __read
                   |          |
                   |          |--13.04%-- vread_hpet
                   |          |
                   |          |--13.04%-- _xcb_lock_io
                   |          |
                   |           --13.04%-- 0x7f630878ce87
    
    Note: it does not only affect perf events but also other stacktraces in
    x86-64. They were considered as unreliable once we quit the debug
    stack frame.
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: "K. Prasad" <prasad@linux.vnet.ibm.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    b625b3b3
entry_64.S 38.5 KB