Ah you've pulled the stale version of my branch. How can we fix that? Can you still unpull and repull or should I make deltas to fix this? Thanks. On Fri, Jan 07, 2011 at 06:48:43PM +0000, tip-bot for Frederic Weisbecker wrote: > Commit-ID: e4754e9a25ce70ee45e89a9c916ac69a2fc2d44e > Gitweb: http://git.kernel.org/tip/e4754e9a25ce70ee45e89a9c916ac69a2fc2d44e > Author: Frederic Weisbecker <fweisbec@xxxxxxxxx> > AuthorDate: Thu, 6 Jan 2011 15:22:47 +0100 > Committer: Frederic Weisbecker <fweisbec@xxxxxxxxx> > CommitDate: Thu, 6 Jan 2011 15:22:47 +0100 > > x86: Fix rbp saving in pt_regs on irq entry > > From the x86_64 low level interrupt handlers, the frame pointer is > saved in pt_regs in the wrong place, in the offset of rbx. > > rbx is not part of the irq partial saved registers, so it's not > critical, but later code that uses get_irq_regs() to get the > interrupted frame pointer instead get a stale rbx value, causing > unwinding code to fail miserably. > > One noticeable impact is the breakage of the stack unwinding from > perf software clock events (cpu-clock, task-clock). > > This patch simply fixes up the saving of rbp to be in pt_regs::rbp > instead of pt_regs::rbx > > 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 > > Reported-by: Soeren Sandmann Pedersen <sandmann@xxxxxxxxxx> > Signed-off-by: Frederic Weisbecker <fweisbec@xxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: H. Peter Anvin <hpa@xxxxxxxxx > Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx> > Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > Cc: Stephane Eranian <eranian@xxxxxxxxxx> > --- > arch/x86/kernel/entry_64.S | 31 +++++++++++++++++++------------ > 1 files changed, 19 insertions(+), 12 deletions(-) > > diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S > index e3ba417..fc3cac6 100644 > --- a/arch/x86/kernel/entry_64.S > +++ b/arch/x86/kernel/entry_64.S > @@ -299,17 +299,21 @@ ENDPROC(native_usergs_sysret64) > ENTRY(save_args) > XCPT_FRAME > cld > - movq_cfi rdi, RDI+16-ARGOFFSET > - movq_cfi rsi, RSI+16-ARGOFFSET > - movq_cfi rdx, RDX+16-ARGOFFSET > - movq_cfi rcx, RCX+16-ARGOFFSET > - movq_cfi rax, RAX+16-ARGOFFSET > - movq_cfi r8, R8+16-ARGOFFSET > - movq_cfi r9, R9+16-ARGOFFSET > - movq_cfi r10, R10+16-ARGOFFSET > - movq_cfi r11, R11+16-ARGOFFSET > - > - leaq -ARGOFFSET+16(%rsp),%rdi /* arg1 for handler */ > + /* > + * start from rbp in pt_regs and jump over > + * return address. > + */ > + movq_cfi rdi, RDI+8-RBP > + movq_cfi rsi, RSI+8-RBP > + movq_cfi rdx, RDX+8-RBP > + movq_cfi rcx, RCX+8-RBP > + movq_cfi rax, RAX+8-RBP > + movq_cfi r8, R8+8-RBP > + movq_cfi r9, R9+8-RBP > + movq_cfi r10, R10+8-RBP > + movq_cfi r11, R11+8-RBP > + > + leaq -RBP+8(%rsp),%rdi /* arg1 for handler */ > movq_cfi rbp, 8 /* push %rbp */ > leaq 8(%rsp), %rbp /* mov %rsp, %ebp */ > testl $3, CS(%rdi) > @@ -782,7 +786,8 @@ END(interrupt) > > /* 0(%rsp): ~(interrupt number) */ > .macro interrupt func > - subq $ORIG_RAX-ARGOFFSET+8, %rsp > + /* reserve pt_regs for scratch regs and rbp */ > + subq $ORIG_RAX-RBP, %rsp > CFI_ADJUST_CFA_OFFSET ORIG_RAX-ARGOFFSET+8 > call save_args > PARTIAL_FRAME 0 > @@ -808,6 +813,8 @@ ret_from_intr: > TRACE_IRQS_OFF > decl PER_CPU_VAR(irq_count) > leaveq > + /* we did not save rbx, restore only from ARGOFFSET */ > + addq $8, %rsp > CFI_RESTORE rbp > CFI_DEF_CFA_REGISTER rsp > CFI_ADJUST_CFA_OFFSET -8 -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |