Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752293AbbEJDX2 (ORCPT ); Sat, 9 May 2015 23:23:28 -0400 Received: from mail7.hitachi.co.jp ([133.145.228.42]:37500 "EHLO mail7.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752252AbbEJDX0 (ORCPT ); Sat, 9 May 2015 23:23:26 -0400 Message-ID: <554ECF26.3030302@hitachi.com> Date: Sun, 10 May 2015 12:23:18 +0900 From: Masami Hiramatsu Organization: Hitachi, Ltd., Japan User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: He Kuang , a.p.zijlstra@chello.nl, acme@kernel.org, jolsa@kernel.org, mingo@redhat.com CC: wangnan0@huawei.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 1/3] perf probe: Remove length limitation for showing available variables References: <1431165306-106463-1-git-send-email-hekuang@huawei.com> In-Reply-To: <1431165306-106463-1-git-send-email-hekuang@huawei.com> Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6390 Lines: 184 On 2015/05/09 18:55, He Kuang wrote: > Use struct strbuf instead of bare char[] to remove the length limitation > of variables in variable_list, so they will not disappear due to > overlength, and make preparation for adding more description for > variables. > Looks good to me! Acked-by: Masami Hiramatsu Thank you, > Signed-off-by: He Kuang > --- > tools/perf/util/dwarf-aux.c | 50 +++++++++++++++++++----------------------- > tools/perf/util/dwarf-aux.h | 4 ++-- > tools/perf/util/probe-finder.c | 17 ++++++++------ > 3 files changed, 34 insertions(+), 37 deletions(-) > > diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c > index 16d46e2..737c9db 100644 > --- a/tools/perf/util/dwarf-aux.c > +++ b/tools/perf/util/dwarf-aux.c > @@ -848,19 +848,17 @@ Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name, > /** > * die_get_typename - Get the name of given variable DIE > * @vr_die: a variable DIE > - * @buf: a buffer for result type name > - * @len: a max-length of @buf > + * @buf: a strbuf for result type name > * > - * Get the name of @vr_die and stores it to @buf. Return the actual length > - * of type name if succeeded. Return -E2BIG if @len is not enough long, and > - * Return -ENOENT if failed to find type name. > + * Get the name of @vr_die and stores it to @buf. Return 0 if succeeded. > + * and Return -ENOENT if failed to find type name. > * Note that the result will stores typedef name if possible, and stores > * "*(function_type)" if the type is a function pointer. > */ > -int die_get_typename(Dwarf_Die *vr_die, char *buf, int len) > +int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf) > { > Dwarf_Die type; > - int tag, ret, ret2; > + int tag, ret; > const char *tmp = ""; > > if (__die_get_real_type(vr_die, &type) == NULL) > @@ -871,8 +869,8 @@ int die_get_typename(Dwarf_Die *vr_die, char *buf, int len) > tmp = "*"; > else if (tag == DW_TAG_subroutine_type) { > /* Function pointer */ > - ret = snprintf(buf, len, "(function_type)"); > - return (ret >= len) ? -E2BIG : ret; > + strbuf_addf(buf, "(function_type)"); > + return 0; > } else { > if (!dwarf_diename(&type)) > return -ENOENT; > @@ -883,39 +881,35 @@ int die_get_typename(Dwarf_Die *vr_die, char *buf, int len) > else if (tag == DW_TAG_enumeration_type) > tmp = "enum "; > /* Write a base name */ > - ret = snprintf(buf, len, "%s%s", tmp, dwarf_diename(&type)); > - return (ret >= len) ? -E2BIG : ret; > - } > - ret = die_get_typename(&type, buf, len); > - if (ret > 0) { > - ret2 = snprintf(buf + ret, len - ret, "%s", tmp); > - ret = (ret2 >= len - ret) ? -E2BIG : ret2 + ret; > + strbuf_addf(buf, "%s%s", tmp, dwarf_diename(&type)); > + return 0; > } > + ret = die_get_typename(&type, buf); > + if (ret == 0) > + strbuf_addf(buf, "%s", tmp); > + > return ret; > } > > /** > * die_get_varname - Get the name and type of given variable DIE > * @vr_die: a variable DIE > - * @buf: a buffer for type and variable name > - * @len: the max-length of @buf > + * @buf: a strbuf for type and variable name > * > * Get the name and type of @vr_die and stores it in @buf as "type\tname". > */ > -int die_get_varname(Dwarf_Die *vr_die, char *buf, int len) > +int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf) > { > - int ret, ret2; > + int ret; > > - ret = die_get_typename(vr_die, buf, len); > + ret = die_get_typename(vr_die, buf); > if (ret < 0) { > pr_debug("Failed to get type, make it unknown.\n"); > - ret = snprintf(buf, len, "(unknown_type)"); > - } > - if (ret > 0) { > - ret2 = snprintf(buf + ret, len - ret, "\t%s", > - dwarf_diename(vr_die)); > - ret = (ret2 >= len - ret) ? -E2BIG : ret2 + ret; > + strbuf_addf(buf, "(unknown_type)"); > } > - return ret; > + > + strbuf_addf(buf, "\t%s", dwarf_diename(vr_die)); > + > + return 0; > } > > diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h > index 50a3cdc..60676fd 100644 > --- a/tools/perf/util/dwarf-aux.h > +++ b/tools/perf/util/dwarf-aux.h > @@ -117,8 +117,8 @@ extern Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name, > Dwarf_Die *die_mem); > > /* Get the name of given variable DIE */ > -extern int die_get_typename(Dwarf_Die *vr_die, char *buf, int len); > +extern int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf); > > /* Get the name and type of given variable DIE, stored as "type\tname" */ > -extern int die_get_varname(Dwarf_Die *vr_die, char *buf, int len); > +extern int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf); > #endif > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > index d5f60c0..dcca551 100644 > --- a/tools/perf/util/probe-finder.c > +++ b/tools/perf/util/probe-finder.c > @@ -1253,14 +1253,11 @@ int debuginfo__find_trace_events(struct debuginfo *dbg, > return (ret < 0) ? ret : tf.ntevs; > } > > -#define MAX_VAR_LEN 64 > - > /* Collect available variables in this scope */ > static int collect_variables_cb(Dwarf_Die *die_mem, void *data) > { > struct available_var_finder *af = data; > struct variable_list *vl; > - char buf[MAX_VAR_LEN]; > int tag, ret; > > vl = &af->vls[af->nvls - 1]; > @@ -1272,10 +1269,16 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data) > af->pf.fb_ops, &af->pf.sp_die, > NULL); > if (ret == 0) { > - ret = die_get_varname(die_mem, buf, MAX_VAR_LEN); > - pr_debug2("Add new var: %s\n", buf); > - if (ret > 0) > - strlist__add(vl->vars, buf); > + struct strbuf buf; > + > + strbuf_init(&buf, 64); > + ret = die_get_varname(die_mem, &buf); > + pr_debug2("Add new var: %s\n", buf.buf); > + if (ret == 0) { > + strlist__add(vl->vars, > + strbuf_detach(&buf, NULL)); > + } > + strbuf_release(&buf); > } > } > > -- Masami HIRAMATSU Linux Technology Research Center, System Productivity Research Dept. Center for Technology Innovation - Systems Engineering Hitachi, Ltd., Research & Development Group 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/