Re: [tip:perf/urgent] x86: Fix rbp saving in pt_regs on irq entry

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Stable Commits]     [Linux Stable Kernel]     [Linux Kernel]     [Linux USB Devel]     [Linux Video &Media]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux