On Sun, Oct 01, 2017 at 04:30:59PM +0200, Milian Wolff wrote:
> This also removes the symbol name from the srcline column,
> more on this below.
> 
> This ensures we use the correct srcline, which could originate
> from a potentially inlined function. The hist entries used to
> query for the srcline based purely on the IP, which leads to
> wrong results for inlined entries.

Yep, AFAICS current srcline returns the first entry in a inline-chain
and the srcfile (sort key) returns the last.  I think we need to make
it consistent.  It seems this patch fix it when --inline option is
used, but I guess the --no-inline case still has the problem.

Thanks,
Namhyung


> 
> Before:
> 
> ~~~~~
> perf report --inline -s srcline -g none --stdio
> ...
> # Children      Self  Source:Line
> # ........  ........  
> ..................................................................................................................................
> #
>     94.23%     0.00%  __libc_start_main+18446603487898210537
>     94.23%     0.00%  _start+41
>     44.58%     0.00%  main+100
>     44.58%     0.00%  std::_Norm_helper<true>::_S_do_it<double>+100
>     44.58%     0.00%  std::__complex_abs+100
>     44.58%     0.00%  std::abs<double>+100
>     44.58%     0.00%  std::norm<double>+100
>     36.01%     0.00%  hypot+18446603487892193300
>     25.81%     0.00%  main+41
>     25.81%     0.00%  
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator()+41
>     25.81%     0.00%  
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> >+41
>     25.75%    25.75%  random.h:143
>     18.39%     0.00%  main+57
>     18.39%     0.00%  
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator()+57
>     18.39%     0.00%  
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> >+57
>     13.80%    13.80%  random.tcc:3330
>      5.64%     0.00%  ??:0
>      4.13%     4.13%  __hypot_finite+163
>      4.13%     0.00%  __hypot_finite+18446603487892193443
> ...
> ~~~~~
> 
> After:
> 
> ~~~~~
> perf report --inline -s srcline -g none --stdio
> ...
> # Children      Self  Source:Line
> # ........  ........  ...........................................
> #
>     94.30%     1.19%  main.cpp:39
>     94.23%     0.00%  __libc_start_main+18446603487898210537
>     94.23%     0.00%  _start+41
>     48.44%     1.70%  random.h:1823
>     48.44%     0.00%  random.h:1814
>     46.74%     2.53%  random.h:185
>     44.68%     0.10%  complex:589
>     44.68%     0.00%  complex:597
>     44.68%     0.00%  complex:654
>     44.68%     0.00%  complex:664
>     40.61%    13.80%  random.tcc:3330
>     36.01%     0.00%  hypot+18446603487892193300
>     26.81%     0.00%  random.h:151
>     26.81%     0.00%  random.h:332
>     25.75%    25.75%  random.h:143
>      5.64%     0.00%  ??:0
>      4.13%     4.13%  __hypot_finite+163
>      4.13%     0.00%  __hypot_finite+18446603487892193443
> ...
> ~~~~~
> 
> Note that this change removes the symbol from the source:line
> hist column. If this information is desired, users should
> explicitly query for it if needed. I.e. run this command
> instead:
> 
> ~~~~~
> perf report --inline -s sym,srcline -g none --stdio
> ...
> # To display the perf.data header info, please use --header/--header-only 
> options.
> #
> #
> # Total Lost Samples: 0
> #
> # Samples: 1K of event 'cycles:uppp'
> # Event count (approx.): 1381229476
> #
> # Children      Self  Symbol                                                  
>                                                                              
> Source:Line
> # ........  ........  
> ...................................................................................................................................
>   ...........................................
> #
>     94.30%     1.19%  [.] main                                                
>                                                                              
> main.cpp:39
>     94.23%     0.00%  [.] __libc_start_main                                   
>                                                                              
> __libc_start_main+18446603487898210537
>     94.23%     0.00%  [.] _start                                              
>                                                                              
> _start+41
>     48.44%     0.00%  [.] 
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> > (inlined)  random.h:1814
>     48.44%     0.00%  [.] 
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> > (inlined)  random.h:1823
>     46.74%     0.00%  [.] 
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)  random.h:185
>     44.68%     0.00%  [.] std::_Norm_helper<true>::_S_do_it<double> (inlined) 
>                                                                              
> complex:654
>     44.68%     0.00%  [.] std::__complex_abs (inlined)                        
>                                                                              
> complex:589
>     44.68%     0.00%  [.] std::abs<double> (inlined)                          
>                                                                              
> complex:597
>     44.68%     0.00%  [.] std::norm<double> (inlined)                         
>                                                                              
> complex:664
>     39.80%    13.59%  [.] std::generate_canonical<double, 53ul, 
> std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >  
>              random.tcc:3330
>     36.01%     0.00%  [.] hypot                                               
>                                                                              
> hypot+18446603487892193300
>     26.81%     0.00%  [.] std::__detail::__mod<unsigned long, 2147483647ul, 
> 16807ul, 0ul> (inlined)                                                       
>  random.h:151
>     26.81%     0.00%  [.] std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>::operator() (inlined)                             
>     random.h:332
>     25.75%     0.00%  [.] std::__detail::_Mod<unsigned long, 2147483647ul, 
> 16807ul, 0ul, true, true>::__calc (inlined)                                   
>   random.h:143
>     25.19%    25.19%  [.] std::generate_canonical<double, 53ul, 
> std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >  
>              random.h:143
>      4.13%     4.13%  [.] __hypot_finite                                      
>                                                                              
> __hypot_finite+163
>      4.13%     0.00%  [.] __hypot_finite                                      
>                                                                              
> __hypot_finite+18446603487892193443
> ...
> ~~~~~
> 
> Compared to the old behavior, this reduces duplication in the output.
> Before we used to print the symbol name in the srcline column even
> when the sym column was explicitly requested. I.e. the output was:
> 
> ~~~~~
> perf report --inline -s sym,srcline -g none --stdio
> ...
> # To display the perf.data header info, please use --header/--header-only 
> options.
> #
> #
> # Total Lost Samples: 0
> #
> # Samples: 1K of event 'cycles:uppp'
> # Event count (approx.): 1381229476
> #
> # Children      Self  Symbol                                                  
>                                                                              
> Source:Line
> # ........  ........  
> ...................................................................................................................................
>   
> ..................................................................................................................................
> #
>     94.23%     0.00%  [.] __libc_start_main                                   
>                                                                              
> __libc_start_main+18446603487898210537
>     94.23%     0.00%  [.] _start                                              
>                                                                              
> _start+41
>     44.58%     0.00%  [.] main                                                
>                                                                              
> main+100
>     44.58%     0.00%  [.] std::_Norm_helper<true>::_S_do_it<double> (inlined) 
>                                                                              
> std::_Norm_helper<true>::_S_do_it<double>+100
>     44.58%     0.00%  [.] std::__complex_abs (inlined)                        
>                                                                              
> std::__complex_abs+100
>     44.58%     0.00%  [.] std::abs<double> (inlined)                          
>                                                                              
> std::abs<double>+100
>     44.58%     0.00%  [.] std::norm<double> (inlined)                         
>                                                                              
> std::norm<double>+100
>     36.01%     0.00%  [.] hypot                                               
>                                                                              
> hypot+18446603487892193300
>     25.81%     0.00%  [.] main                                                
>                                                                              
> main+41
>     25.81%     0.00%  [.] 
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)  
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator()+41
>     25.81%     0.00%  [.] 
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> > (inlined)  
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> >+41
>     25.69%    25.69%  [.] std::generate_canonical<double, 53ul, 
> std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >  
>              random.h:143
>     18.39%     0.00%  [.] main                                                
>                                                                              
> main+57
>     18.39%     0.00%  [.] 
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)  
> std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 
> 16807ul, 0ul, 2147483647ul>, double>::operator()+57
>     18.39%     0.00%  [.] 
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> > (inlined)  
> std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned
>  long, 16807ul, 0ul, 2147483647ul> >+57
>     13.80%    13.80%  [.] std::generate_canonical<double, 53ul, 
> std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >  
>              random.tcc:3330
>      4.13%     4.13%  [.] __hypot_finite                                      
>                                                                              
> __hypot_finite+163
>      4.13%     0.00%  [.] __hypot_finite                                      
>                                                                              
> __hypot_finite+18446603487892193443
> ...
> ~~~~~
> 
> Cc: Arnaldo Carvalho de Melo <a...@redhat.com>
> Cc: David Ahern <dsah...@gmail.com>
> Cc: Namhyung Kim <namhy...@kernel.org>
> Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
> Cc: Yao Jin <yao....@linux.intel.com>
> Signed-off-by: Milian Wolff <milian.wo...@kdab.com>
> ---
>  tools/perf/util/callchain.c | 1 +
>  tools/perf/util/event.c     | 1 +
>  tools/perf/util/hist.c      | 2 ++
>  tools/perf/util/symbol.h    | 1 +
>  4 files changed, 5 insertions(+)
> 
> diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
> index 48d2869025b3..1b82225b96c3 100644
> --- a/tools/perf/util/callchain.c
> +++ b/tools/perf/util/callchain.c
> @@ -1065,6 +1065,7 @@ int fill_callchain_info(struct addr_location *al, 
> struct callchain_cursor_node *
>  {
>       al->map = node->map;
>       al->sym = node->sym;
> +     al->srcline = node->srcline;
>       if (node->map)
>               al->addr = node->map->map_ip(node->map, node->ip);
>       else
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 10366b87d0b5..2c651dc4fcda 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -1503,6 +1503,7 @@ int machine__resolve(struct machine *machine, struct 
> addr_location *al,
>       al->sym = NULL;
>       al->cpu = sample->cpu;
>       al->socket = -1;
> +     al->srcline = NULL;
>  
>       if (al->cpu >= 0) {
>               struct perf_env *env = machine->env;
> diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
> index b0fa9c217e1c..25d143053ab5 100644
> --- a/tools/perf/util/hist.c
> +++ b/tools/perf/util/hist.c
> @@ -596,6 +596,7 @@ __hists__add_entry(struct hists *hists,
>                       .map    = al->map,
>                       .sym    = al->sym,
>               },
> +             .srcline = al->srcline ? strdup(al->srcline) : NULL,
>               .socket  = al->socket,
>               .cpu     = al->cpu,
>               .cpumode = al->cpumode,
> @@ -950,6 +951,7 @@ iter_add_next_cumulative_entry(struct hist_entry_iter 
> *iter,
>                       .map = al->map,
>                       .sym = al->sym,
>               },
> +             .srcline = al->srcline ? strdup(al->srcline) : NULL,
>               .parent = iter->parent,
>               .raw_data = sample->raw_data,
>               .raw_size = sample->raw_size,
> diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
> index 8f072c28b6d3..a2aec8048bb1 100644
> --- a/tools/perf/util/symbol.h
> +++ b/tools/perf/util/symbol.h
> @@ -209,6 +209,7 @@ struct addr_location {
>       struct thread *thread;
>       struct map    *map;
>       struct symbol *sym;
> +     const char    *srcline;
>       u64           addr;
>       char          level;
>       u8            filtered;
> -- 
> 2.14.2
> 

Reply via email to