• F
    x86: Save rbp in pt_regs on irq entry · 625dbc3b
    Frederic Weisbecker 提交于
    From the x86_64 low level interrupt handlers, the frame pointer is
    saved right after the partial pt_regs frame.
    
    rbp is not supposed to be part of the irq partial saved registers,
    but it only requires to extend the pt_regs frame by 8 bytes to
    do so, plus a tiny stack offset fixup on irq exit.
    
    This changes a bit the semantics or get_irq_entry() that is supposed
    to provide only the value of caller saved registers and the cpu
    saved frame. However it's a win for unwinders that can walk through
    stack frames on top of get_irq_regs() snapshots.
    
    A noticeable impact is that it makes perf events cpu-clock and
    task-clock events based callchains working on x86_64.
    
    Let's then save rbp into the irq pt_regs.
    
    As a result with:
    
    	perf record -e cpu-clock perf bench sched messaging
    	perf report --stdio
    
    Before:
        20.94%             perf  [kernel.kallsyms]        [k] lock_acquire
                           |
                           --- lock_acquire
                              |
                              |--44.01%-- __write_nocancel
                              |
                              |--43.18%-- __read
                              |
                              |--6.08%-- fork
                              |          create_worker
                              |
                              |--0.88%-- _dl_fixup
                              |
                              |--0.65%-- do_lookup_x
                              |
                              |--0.53%-- __GI___libc_read
                               --4.67%-- [...]
    
    After:
        19.23%         perf  [kernel.kallsyms]    [k] __lock_acquire
                       |
                       --- __lock_acquire
                          |
                          |--97.74%-- lock_acquire
                          |          |
                          |          |--21.82%-- _raw_spin_lock
                          |          |          |
                          |          |          |--37.26%-- unix_stream_recvmsg
                          |          |          |          sock_aio_read
                          |          |          |          do_sync_read
                          |          |          |          vfs_read
                          |          |          |          sys_read
                          |          |          |          system_call
                          |          |          |          __read
                          |          |          |
                          |          |          |--24.09%-- unix_stream_sendmsg
                          |          |          |          sock_aio_write
                          |          |          |          do_sync_write
                          |          |          |          vfs_write
                          |          |          |          sys_write
                          |          |          |          system_call
                          |          |          |          __write_nocancel
    
    v2: Fix cfi annotations.
    Reported-by: NSoeren Sandmann Pedersen <sandmann@redhat.com>
    Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: H. Peter Anvin <hpa@zytor.com
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Jan Beulich <JBeulich@novell.com>
    625dbc3b
entry_64.S 37.0 KB