Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752584AbbDBHbJ (ORCPT ); Thu, 2 Apr 2015 03:31:09 -0400 Received: from mail7.hitachi.co.jp ([133.145.228.42]:60757 "EHLO mail7.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751688AbbDBHbH (ORCPT ); Thu, 2 Apr 2015 03:31:07 -0400 Message-ID: <551CF035.10306@hitachi.com> Date: Thu, 02 Apr 2015 16:31:01 +0900 From: Masami Hiramatsu Organization: Hitachi, Ltd., Japan User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20120614 Thunderbird/13.0.1 MIME-Version: 1.0 To: Arnaldo Carvalho de Melo CC: Peter Zijlstra , Linux Kernel Mailing List , David Ahern , namhyung@kernel.org, Jiri Olsa , Ingo Molnar Subject: Re: [PATCH perf/core ] perf-probe: Fix to track down unnamed union/structure members References: <20150305153256.GX5187@kernel.org> <20150309021514.4202.36962.stgit@localhost.localdomain> In-Reply-To: <20150309021514.4202.36962.stgit@localhost.localdomain> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3841 Lines: 106 (2015/03/09 11:15), Masami Hiramatsu wrote: > Fix perf probe to track down unnamed union/structure members. > perf probe did not track down the tree of unnamed union/structure > members, since it just failed to find given "name" in a parent > structure/union. To solve this issue, I've introduced 2 changes. > > - Fix die_find_member() to track down the type-DIE if it is > unnamed, and if it contains the specified member, returns the > unnamed member. > (note that we don't return found member, since unnamed member > has the offset in the parent structure) > - Fix convert_variable_fields() to track down the unnamed union/ > structure (one-by-one). > > With this patch, perf probe can access unnamed fields. > ----- > #./perf probe -nfx ./perf lock__delete ops 'locked_ops=ops->locked.ops' > Added new event: > probe_perf:lock__delete (on lock__delete in /home/mhiramat/ksrc/linux-3/tools/perf/perf with ops locked_ops=ops->locked.ops) > > You can now use it in all perf tools, such as: > > perf record -e probe_perf:lock__delete -aR sleep 1 > ----- > > The original report of this issue is: https://lkml.org/lkml/2015/3/5/431 > > Reported-by: Arnaldo Carvalho de Melo > Signed-off-by: Masami Hiramatsu > --- > tools/perf/util/dwarf-aux.c | 14 ++++++++++---- > tools/perf/util/probe-finder.c | 8 +++++++- > 2 files changed, 17 insertions(+), 5 deletions(-) > > diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c > index 780b2bc..c34e024 100644 > --- a/tools/perf/util/dwarf-aux.c > +++ b/tools/perf/util/dwarf-aux.c > @@ -801,10 +801,16 @@ static int __die_find_member_cb(Dwarf_Die *die_mem, void *data) > { > const char *name = data; > > - if ((dwarf_tag(die_mem) == DW_TAG_member) && > - die_compare_name(die_mem, name)) > - return DIE_FIND_CB_END; > - > + if (dwarf_tag(die_mem) == DW_TAG_member) { > + if (die_compare_name(die_mem, name)) > + return DIE_FIND_CB_END; > + else if (!dwarf_diename(die_mem)) { /* Unnamed structure */ > + Dwarf_Die type_die, tmp_die; > + if (die_get_type(die_mem, &type_die) && > + die_find_member(&type_die, name, &tmp_die)) > + return DIE_FIND_CB_END; > + } > + } > return DIE_FIND_CB_SIBLING; > } > > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > index 46f009a..3898eba 100644 > --- a/tools/perf/util/probe-finder.c > +++ b/tools/perf/util/probe-finder.c > @@ -460,7 +460,8 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname, > " nor array.\n", varname); > return -EINVAL; > } > - if (field->ref) { > + /* While prcessing unnamed field, we don't care about this */ > + if (field->ref && !dwarf_diename(vr_die)) { ^^ Oops! this should be inverted! I've missed to include a local fix to this patch... Thank you, > pr_err("Semantic error: %s must be referred by '.'\n", > field->name); > return -EINVAL; > @@ -491,6 +492,11 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname, > } > ref->offset += (long)offs; > > + /* If this member is unnamed, we need to reuse this field */ > + if (!dwarf_diename(die_mem)) > + return convert_variable_fields(die_mem, varname, field, > + &ref, die_mem); > + > next: > /* Converting next field */ > if (field->next) > > -- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu.pt@hitachi.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/