[RFC 2/3] arm64: refactor save_stack_trace()
AKASHI Takahiro
takahiro.akashi at linaro.org
Tue Jul 21 03:26:39 PDT 2015
On 07/21/2015 08:53 AM, AKASHI Takahiro wrote:
> Hi
>
> So i don't have to repost my patch here. Please use the original
> commit log message[1/3] as is.
> But please keep in mind that there is still an issue that I mentioned
> in the cover letter; 'Size' field is inaccurate.
> <reported size> = <its own dynamic local variables>
> + <child's local variables>
> and
> <real size> = <reported size> + <its local variables>
> - <child's local variables>
> where "dynamic" means, for example, a variable allocated like the below:
> int foo(int num) {
> int array[num];
> ...
> }
> (See more details in my ascii art.)
>
> Such usage is seldom seen in the kernel, and <reported size> is
> likely equal to <child's local variables>. In other words, we will
> see one-line *displacement* in most cases.
Well, I have a quick fix now, but it looks ugly.
In addition, I found another issue; With function_graph tracer,
the output is like:
# cat /sys/kernel/tracing/stack_trace
Depth Size Location (78 entries)
----- ---- --------
0) 6184 32 update_min_vruntime+0x14/0x74
1) 6152 48 update_curr+0x6c/0x150
2) 6104 128 enqueue_task_fair+0x2f4/0xb9c
3) 5976 48 enqueue_task+0x48/0x90
...
18) 5160 112 hrtimer_interrupt+0xa0/0x214
19) 5048 32 arch_timer_handler_phys+0x38/0x48
20) 5016 0 ftrace_graph_caller+0x2c/0x30
21) 5016 64 ftrace_graph_caller+0x2c/0x30
22) 4952 32 ftrace_graph_caller+0x2c/0x30
23) 4920 64 ftrace_graph_caller+0x2c/0x30
...
Since, with function_graph tracer, we modify LR register in a stack frame
when we enter into a function, we have to manage such special cases
in save_stack_trace() or check_stack() as x86 does in
print_ftrace_graph_addr().
Thanks,
-Takahiro AKASHI
> (We'd better mention it explicitly in the commmit?)
>
> Thanks,
> -Takahiro AKASHI
>
>
> On 07/21/2015 01:20 AM, Will Deacon wrote:
>> Hi all,
>>
>> On Fri, Jul 17, 2015 at 04:34:21PM +0100, Jungseok Lee wrote:
>>> On Jul 17, 2015, at 11:59 PM, Jungseok Lee wrote:
>>>> On Jul 17, 2015, at 11:41 PM, Steven Rostedt wrote:
>>>>> Thanks! Can you repost patch 1 with the changes I recommended, so that
>>>>> I can get an Acked-by from the arm64 maintainers and pull all the
>>>>> changes in together. This is fine for a 4.3 release, right? That is, it
>>>>> doesn't need to go into 4.2-rcs.
>>>>>
>>>>
>>>> It's not hard to repost a patch, but I feel like we have to wait for Akashi's response.
>>>> Also, it might be needed to consider Mark's comment on arch part.
>>>>
>>>> If they are okay, I will proceed.
>>>
>>> The [RFC 1/3] patch used in my environment is shaped as follows.
>>> I leave the hunk for *only* clear synchronization. This is why I choose this format
>>> instead of reposting a patch. I hope it would help to track down this thread.
>>>
>>> I think this is my best at this point.
>>>
>>> ----8<----
>>> diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h
>>> index c5534fa..2b43e20 100644
>>> --- a/arch/arm64/include/asm/ftrace.h
>>> +++ b/arch/arm64/include/asm/ftrace.h
>>> @@ -13,8 +13,9 @@
>>>
>>> #include <asm/insn.h>
>>>
>>> -#define MCOUNT_ADDR ((unsigned long)_mcount)
>>> -#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE
>>> +#define MCOUNT_ADDR ((unsigned long)_mcount)
>>> +#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE
>>> +#define FTRACE_STACK_FRAME_OFFSET AARCH64_INSN_SIZE
>>>
>>> #ifndef __ASSEMBLY__
>>> #include <linux/compat.h>
>>> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
>>> index 407991b..9ab67af 100644
>>> --- a/arch/arm64/kernel/stacktrace.c
>>> +++ b/arch/arm64/kernel/stacktrace.c
>>> @@ -20,6 +20,7 @@
>>> #include <linux/sched.h>
>>> #include <linux/stacktrace.h>
>>>
>>> +#include <asm/insn.h>
>>> #include <asm/stacktrace.h>
>>>
>>> /*
>>> @@ -52,7 +53,7 @@ int notrace unwind_frame(struct stackframe *frame)
>>> * -4 here because we care about the PC at time of bl,
>>> * not where the return will go.
>>> */
>>> - frame->pc = *(unsigned long *)(fp + 8) - 4;
>>> + frame->pc = *(unsigned long *)(fp + 8) - AARCH64_INSN_SIZE;
>>>
>>> return 0;
>>> }
>>
>> The arm64 bits look fine to me:
>>
>> Acked-by: Will Deacon <will.deacon at arm.com>
>>
>> Steve: feel free to take this along with the other ftrace changes. I don't
>> anticipate any conflicts, but if anything crops up in -next we can sort
>> it out then.
>>
>> Thanks!
>>
>> Will
>>
More information about the linux-arm-kernel
mailing list