Re: [PATCH v2]: perf/x86: store user space frame-pointer value on a sample

From: Alexey Budankov
Date: Wed May 16 2018 - 04:09:49 EST


Hi,
On 15.05.2018 19:30, Andy Lutomirski wrote:
>
>> On May 15, 2018, at 1:08 AM, Alexey Budankov <alexey.budankov@xxxxxxxxxxxxxxx> wrote:
>>
>>
>> Hi Andy,
>>
>>> On 09.05.2018 17:54, Peter Zijlstra wrote:
>>>> On Tue, May 08, 2018 at 06:21:36PM +0300, Alexey Budankov wrote:
>>>>
>>>> Store user space frame-pointer value (BP register) into Perf trace
>>>> on a sample for a process so the value becomes available when
>>>> unwinding call stacks for functions gaining event samples.
>>>>
>>>> Signed-off-by: Alexey Budankov <alexey.budankov@xxxxxxxxxxxxxxx>
>>>> ---
>>>> arch/x86/kernel/perf_regs.c | 8 +++++++-
>>>> 1 file changed, 7 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
>>>> index e47b2dbbdef3..8d68658eff7f 100644
>>>> --- a/arch/x86/kernel/perf_regs.c
>>>> +++ b/arch/x86/kernel/perf_regs.c
>>>> @@ -156,7 +156,13 @@ void perf_get_regs_user(struct perf_regs *regs_user,
>>>
>>>
>>>> * Most system calls don't save these registers, don't report them.
>>>
>>> ^^^ that worries me and is the reason for the '-1's below. However I
>>> think with all the PTI rework this might no longer be true.
>>>
>>> The Changelog needs to state that user_regs->bp is in fact valid and
>>> ideally point to the commits that makes it so. Also this patch should
>>> update that comment.
>>>
>>> Cc Andy who keeps better track of all that than me.
>>
>> Are there any thoughts so far? Feedback on the matter above is highly appreciated.
>
> Sorry, I missed this. Can you forward the original patch? I donât have it.

Store user space frame-pointer value (BP register) into Perf trace
on a sample for a process so the value becomes available when
unwinding call stacks for functions gaining event samples.

Signed-off-by: Alexey Budankov <alexey.budankov@xxxxxxxxxxxxxxx>
---
arch/x86/kernel/perf_regs.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/perf_regs.c b/arch/x86/kernel/perf_regs.c
index e47b2dbbdef3..8d68658eff7f 100644
--- a/arch/x86/kernel/perf_regs.c
+++ b/arch/x86/kernel/perf_regs.c
@@ -156,7 +156,13 @@ void perf_get_regs_user(struct perf_regs *regs_user,
* Most system calls don't save these registers, don't report them.
*/
regs_user_copy->bx = -1;
- regs_user_copy->bp = -1;
+ /*
+ * Store user space frame-pointer value on sample
+ * to facilitate stack unwinding for cases when
+ * user space executable code has such support
+ * enabled at compile time;
+ */
+ regs_user_copy->bp = user_regs->bp;
regs_user_copy->r12 = -1;
regs_user_copy->r13 = -1;
regs_user_copy->r14 = -1;

> These days, system calls should save all registers, but Iâm not entirely sure I want to promise that theyâll continue to do so forever.
>