Em Sat, Oct 14, 2017 at 09:30:54PM +0200, Milian Wolff escreveu:
> On Freitag, 13. Oktober 2017 16:08:34 CEST Arnaldo Carvalho de Melo wrote:
> > Em Fri, Oct 13, 2017 at 10:39:03AM -0300, Arnaldo Carvalho de Melo escreveu:
> > > Em Mon, Oct 09, 2017 at 10:33:05PM +0200, Milian Wolff escreveu:
> > > > Some of the code paths I introduced before returned too early
> > > > without running the code to handle a node's branch count.
> > > > By refactoring match_chain to only have one exit point, this
> > > > can be remedied.
> > > 
> > > Fixing up this one now.
> > 
> > Millian, this is all fresher in your mind, can you please take a look at
> > my perf/core branch and check if the change i made to ]PATCH v5 09/16]
> > "perf report: compare symbol name for inlined frames when matching" is
> > ok wrt Ravi's fix and then, please, rebase v5 on top of what is there?
> 
> Regarding the 09/16 patch, I think your change is fine. With your rebase 
> request, do you mean I should rebase the rest of v5 (starting from 11/16, you 
> seem to have applied 10/16 already) and resent that as v6? I can do that, 
> when 
> I get the time.

Yes, can you please do that? As soon as you have the time, if I think it
takes long I'll just move it to a separate branch and continue
processing other patches, just take your time.

Right now I'm processing/testing some perf/urgent bits.

- Arnaldo
 
> > Ravi, please take a look at this as well, to see if with these changes
> > your fix remains valid, ok?
> > 
> > Thanks,
> 
> Thanks for the review and rebase.
> 
> > > > 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 | 117
> > > >  +++++++++++++++++++++++--------------------- 1 file changed, 60
> > > >  insertions(+), 57 deletions(-)
> > > > 
> > > > diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
> > > > index 3f1431bf71bd..782de047c902 100644
> > > > --- a/tools/perf/util/callchain.c
> > > > +++ b/tools/perf/util/callchain.c
> > > > @@ -666,78 +666,81 @@ static enum match_result match_chain_strings(const
> > > > char *left,> > 
> > > >         return ret;
> > > >  
> > > >  }
> > > > 
> > > > +static enum match_result match_address(u64 left, u64 right)
> > > > +{
> > > > +       if (left == right)
> > > > +               return MATCH_EQ;
> > > > +       else if (left < right)
> > > > +               return MATCH_LT;
> > > > +       else
> > > > +               return MATCH_GT;
> > > > +}
> > > > +
> > > > 
> > > >  static enum match_result match_chain(struct callchain_cursor_node
> > > >  *node,
> > > >  
> > > >                                      struct callchain_list *cnode)
> > > >  
> > > >  {
> > > > 
> > > > -       struct symbol *sym = node->sym;
> > > > -       enum match_result match;
> > > > -       u64 left, right;
> > > > +       enum match_result match = MATCH_ERROR;
> > > > 
> > > > -       if (callchain_param.key == CCKEY_SRCLINE) {
> > > > +       switch (callchain_param.key) {
> > > > 
> > > > +       case CCKEY_SRCLINE:
> > > >                 match = match_chain_strings(cnode->srcline, 
> > > > node->srcline);
> > > > 
> > > > -
> > > > -               /* if no srcline is available, fallback to symbol name 
> > > > */
> > > > -               if (match == MATCH_ERROR && cnode->ms.sym && node->sym)
> > > > -                       match = match_chain_strings(cnode->ms.sym->name,
> > > > -                                                   node->sym->name);
> > > > -
> > > > 
> > > >                 if (match != MATCH_ERROR)
> > > > 
> > > > -                       return match;
> > > > -
> > > > -               /* otherwise fall-back to IP-based comparison below */
> > > > -       }
> > > > -
> > > > -       if (cnode->ms.sym && sym && callchain_param.key == 
> > > > CCKEY_FUNCTION) {
> > > > -               /* compare inlined frames based on their symbol name 
> > > > because
> > > > -                * different inlined frames will have the same symbol 
> > > > start
> > > > -                */
> > > > -               if (cnode->ms.sym->inlined || node->sym->inlined)
> > > > -                       return match_chain_strings(cnode->ms.sym->name,
> > > > -                                                  node->sym->name);
> > > > -
> > > > -               left = cnode->ms.sym->start;
> > > > -               right = sym->start;
> > > > -       } else {
> > > > -               left = cnode->ip;
> > > > -               right = node->ip;
> > > > +                       break;
> > > > +               __fallthrough;
> > > > +       case CCKEY_FUNCTION:
> > > > +               if (node->sym && cnode->ms.sym) {
> > > > +                       /* compare inlined frames based on their symbol 
> > > > name
> > > > +                        * because different inlined frames will have 
> > > > the same
> > > > +                        * symbol start. otherwise do a faster 
> > > > comparison based
> > > > +                        * on the symbol start address
> > > > +                        */
> > > > +                       if (cnode->ms.sym->inlined || 
> > > > node->sym->inlined)
> > > > +                               match = 
> > > > match_chain_strings(cnode->ms.sym->name,
> > > > +                                                           
> > > > node->sym->name);
> > > > +                       else
> > > > +                               match = 
> > > > match_address(cnode->ms.sym->start,
> > > > +                                                     node->sym->start);
> > > > +                       if (match != MATCH_ERROR)
> > > > +                               break;
> > > > +               }
> > > > +               __fallthrough;
> > > > +       case CCKEY_ADDRESS:
> > > > +       default:
> > > > +               match = match_address(cnode->ip, node->ip);
> > > > +               break;
> > > > 
> > > >         }
> > > > 
> > > > -       if (left == right) {
> > > > -               if (node->branch) {
> > > > -                       cnode->branch_count++;
> > > > +       if (match == MATCH_EQ && node->branch) {
> > > > +               cnode->branch_count++;
> > > > 
> > > > -                       if (node->branch_from) {
> > > > -                               /*
> > > > -                                * It's "to" of a branch
> > > > -                                */
> > > > -                               cnode->brtype_stat.branch_to = true;
> > > > +               if (node->branch_from) {
> > > > +                       /*
> > > > +                        * It's "to" of a branch
> > > > +                        */
> > > > +                       cnode->brtype_stat.branch_to = true;
> > > > 
> > > > -                               if (node->branch_flags.predicted)
> > > > -                                       cnode->predicted_count++;
> > > > +                       if (node->branch_flags.predicted)
> > > > +                               cnode->predicted_count++;
> > > > 
> > > > -                               if (node->branch_flags.abort)
> > > > -                                       cnode->abort_count++;
> > > > +                       if (node->branch_flags.abort)
> > > > +                               cnode->abort_count++;
> > > > 
> > > > -                               branch_type_count(&cnode->brtype_stat,
> > > > -                                                 &node->branch_flags,
> > > > -                                                 node->branch_from,
> > > > -                                                 node->ip);
> > > > -                       } else {
> > > > -                               /*
> > > > -                                * It's "from" of a branch
> > > > -                                */
> > > > -                               cnode->brtype_stat.branch_to = false;
> > > > -                               cnode->cycles_count +=
> > > > -                                       node->branch_flags.cycles;
> > > > -                               cnode->iter_count += node->nr_loop_iter;
> > > > -                               cnode->iter_cycles += node->iter_cycles;
> > > > -                       }
> > > > +                       branch_type_count(&cnode->brtype_stat,
> > > > +                                         &node->branch_flags,
> > > > +                                         node->branch_from,
> > > > +                                         node->ip);
> > > > +               } else {
> > > > +                       /*
> > > > +                        * It's "from" of a branch
> > > > +                        */
> > > > +                       cnode->brtype_stat.branch_to = false;
> > > > +                       cnode->cycles_count += 
> > > > node->branch_flags.cycles;
> > > > +                       cnode->iter_count += node->nr_loop_iter;
> > > > +                       cnode->iter_cycles += node->iter_cycles;
> > > > 
> > > >                 }
> > > > 
> > > > -
> > > > -               return MATCH_EQ;
> > > > 
> > > >         }
> > > > 
> > > > -       return left > right ? MATCH_GT : MATCH_LT;
> > > > +       return match;
> > > > 
> > > >  }
> > > >  
> > > >  /*
> 
> 
> -- 
> Milian Wolff | milian.wo...@kdab.com | Senior Software Engineer
> KDAB (Deutschland) GmbH&Co KG, a KDAB Group company
> Tel: +49-30-521325470
> KDAB - The Qt Experts
> 

Reply via email to