All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiaxing Wang <wangjiaxing@insigma.com.cn>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
	Ingo Molnar <mingo@redhat.com>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] tracing:Do not profile dumpstack utilities to fix stack trace output
Date: Sun, 20 Apr 2014 07:47:03 +0800	[thread overview]
Message-ID: <53530AF7.7020807@insigma.com.cn> (raw)
In-Reply-To: <20140419111820.2a8a3ac8@gandalf.local.home>

On 04/19/2014 11:18 PM, Steven Rostedt wrote:
> On Sat, 19 Apr 2014 15:45:46 +0800
> Jiaxing Wang <wangjiaxing@insigma.com.cn> wrote:
> 
>> When function_graph tracer is enabled, we get stack trace like this:
>>
>>          Depth    Size   Location    (88 entries)
>>          -----    ----   --------
>>    0)     3232       0   update_curr+0xe/0x1e0
>>    1)     3232       0   dump_trace+0xb5/0x1b0
>>    2)     3232       0   ftrace_ops_list_func+0xe6/0x100
>>    3)     3232      68   ftrace_call+0x5/0xb
>>    4)     3164      92   enqueue_entity+0x38/0xe20
>>    5)     3072       0   return_to_handler+0x0/0xf
>>    6)     3072      80   save_stack_trace+0x30/0x50
>>    7)     2992       0   return_to_handler+0x0/0xf
>>    8)     2992      28   stack_trace_call+0x119/0x340
>>    9)     2964       0   return_to_handler+0x0/0xf
>>   10)     2964      12   enqueue_task_fair+0x47/0x7e0
>>   11)     2952       0   return_to_handler+0x0/0xf
>>   12)     2952      16   enqueue_task+0x45/0x70
>>   ... ...
>>
>> The 'save_stack_trace+0x30/0x50' and 'stack_trace_call+0x119/0x340'
>> entries are misplaced below the ftrace_ops_list_func and ftrace_call entries,
>> which looks very confusing.
>>
>> And dump_stack() is also affected when function_graph tracer is enabled:
>>
>>   [  425.353391] Call Trace:
>>   [  425.353449]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.353496]  [<c1012546>] print_context_stack+0xc6/0xd0
>>   [  425.353547]  [<c108ab84>] enqueue_entity+0x894/0xe60
>>   [  425.353597]  [<c107b4c5>] ? enqueue_task+0x45/0x70
>>   [  425.353649]  [<c108b159>] ? enqueue_task_fair+0x9/0x7e0
>>   [  425.353694]  [<c107b4c5>] ? enqueue_task+0x45/0x70
>>   [  425.353743]  [<c1041037>] ? prepare_ftrace_return+0x77/0xa0
>>   [  425.353791]  [<c108b159>] ? enqueue_task_fair+0x9/0x7e0
>>   [  425.353856]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.353901]  [<c10116b5>] dump_trace+0xb5/0x1b0
>>   [  425.353958]  [<c107b4dd>] ? enqueue_task+0x5d/0x70
>>   [  425.354002]  [<c107b436>] ? update_rq_clock.part.80+0x6/0x50
>>   [  425.354074]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.354120]  [<c1012666>] show_trace_log_lvl+0x46/0x50
>>   [  425.354178]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.354222]  [<c1011802>] show_stack_log_lvl+0x52/0xe0
>>   [  425.354272]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.354317]  [<c10126c6>] show_stack+0x26/0x50
>>   [  425.354369]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.354415]  [<c1643be1>] dump_stack+0x41/0x52
>>   [  425.354483]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.354527]  [<c108b197>] enqueue_task_fair+0x47/0x7e0
>>   [  425.354576]  [<c16531c1>] ftrace_graph_caller+0x19/0x19
>>   [  425.354621]  [<c107b4c5>] enqueue_task+0x45/0x70
>>   ... ...
>>
>> This happens because the functions in the route of stack_trace and
>> dump_stack() get function_graph traced, their return addresses on stack are
>> replaced by 'return_to_handler' and their real return addresses are
>> saved in current->ret_stack[].(Specifically, these functons include
>> save_stack_trace,dump_trace,print_context_stack,print_ftrace_graph_addr
>> in the case of stack_trace and show_stack,show_stack_log_lvl,show_trace_log_lvl
>> ,dump_trace,print_context_stack,print_ftrace_graph_addr in the case of
>> dump_stack()).
>>
>> When dumping the stack, their 'return_to_handler' on stack are skipped
>> but not their corresponding current->ret_stack entries which then are matched
>> with other function's 'return_to_handler' on the stack and resulting the
>> wrong output above.
> 
> This sounds like a separate bug that should be fixed.
> 
Return addresses are skipped as stack_trace dump stack from the return
address of dump_trace() and dump_stack() dump stack from the return address
of show_stack().

Here is the stack_trace case:
  stack                               current->ret_stack[]
  -----                               --------------------
  return_to_handler                   print_context_stack+0xc6/0xd0
  return_to_handler                   dump_trace+0xb5/0x1b0
  return_to_handler                   save_stack_trace+0x30/0x50
  return_to_handler                   stack_trace_call+0x119/0x340
  ftrace_ops_listfunc+0xe6/0x100
  ftrace_call+0x5/0xb

So when dump, the first two 'return_to_handler' entries are skipped but
not the current->ret_stack[] entries.

And the following is the dump_stack() case:

  stack                               current->ret_stack[]
  -----                               --------------------
  return_to_handler                   print_context_stack+0xc6/0xd0
  return_to_handler                   dump_trace+0xb5/0x1b0
  return_to_handler                   show_trace_log_lvl+0x46/0x50
  return_to_handler                   show_stack_log_lvl+0x52/0xe0
  return_to_handler                   show_stack+0x26/0x50
  return_to_handler                   dump_stack+0x41/0x52

In this case the first five 'return_to_handler' entries on stack are
skipped but not the current->ret_stack[] entries.

So the problem is caused by dumpstack utilities get traced by function_graph
tracer, and disable the profiling of them fixes this.

Thanks.
>>
>> To fix this, we can disable the profiling of dumpstack utilities.
>>
>> Signed-off-by: Jiaxing Wang <wangjiaxing@insigma.com.cn>
>> ---
>>  arch/x86/kernel/Makefile | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
>> index f4d9600..9dd8ce4 100644
>> --- a/arch/x86/kernel/Makefile
>> +++ b/arch/x86/kernel/Makefile
>> @@ -14,6 +14,9 @@ CFLAGS_REMOVE_pvclock.o = -pg
>>  CFLAGS_REMOVE_kvmclock.o = -pg
>>  CFLAGS_REMOVE_ftrace.o = -pg
>>  CFLAGS_REMOVE_early_printk.o = -pg
>> +CFLAGS_REMOVE_dumpstack.o = -pg
>> +CFLAGS_REMOVE_dumpstack_32.o = -pg
>> +CFLAGS_REMOVE_stacktrace.o = -pg
> 
> I have no problem with this change, but it is 3.16 material. But if the
> function graph tracer is causing the stack trace to be incorrect, then
> that is a separate issues that we should try to rectify.
> 
> -- Steve
> 
>>  endif
>>  
>>  CFLAGS_irq.o := -I$(src)/../include/asm/trace
> 
> .
> 


  reply	other threads:[~2014-04-19 23:47 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-19  7:45 [PATCH] tracing:Do not profile dumpstack utilities to fix stack trace output Jiaxing Wang
2014-04-19 15:18 ` Steven Rostedt
2014-04-19 23:47   ` Jiaxing Wang [this message]
2014-04-24 17:39     ` Steven Rostedt
2014-04-24 17:41 ` Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53530AF7.7020807@insigma.com.cn \
    --to=wangjiaxing@insigma.com.cn \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.