Messages in this thread Patch in this message | | | Date | Tue, 21 Jul 2015 19:26:39 +0900 | From | AKASHI Takahiro <> | Subject | Re: [RFC 2/3] arm64: refactor save_stack_trace() |
| |
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@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 >>
| |