From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935178AbcI0RlP (ORCPT ); Tue, 27 Sep 2016 13:41:15 -0400 Received: from mail.kernel.org ([198.145.29.136]:60848 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934109AbcI0RlH (ORCPT ); Tue, 27 Sep 2016 13:41:07 -0400 Date: Tue, 27 Sep 2016 14:41:00 -0300 From: Arnaldo Carvalho de Melo To: Sukadev Bhattiprolu Cc: peterz@infradead.org, maddy@linux.vnet.ibm.com, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v21 06/19] perf, tools: Support alias descriptions Message-ID: <20160927174100.GO5588@kernel.org> References: <1473978296-20712-1-git-send-email-sukadev@linux.vnet.ibm.com> <1473978296-20712-7-git-send-email-sukadev@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1473978296-20712-7-git-send-email-sukadev@linux.vnet.ibm.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.7.0 (2016-08-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Thu, Sep 15, 2016 at 03:24:43PM -0700, Sukadev Bhattiprolu escreveu: > From: Andi Kleen > > Add support to print alias descriptions in perf list, which > are taken from the generated event files. > > The sorting code is changed to put the events with descriptions > at the end. The descriptions are printed as possibly multiple word > wrapped lines. So, now I'm trying to reproduce the results below, but I couldn't find a tarball with those .json files for me to use, can you provide me with one? I've put what I have at: git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tmp.perf/json Now testing Jiri's cross compiling patch... Thanks, - Arnaldo > Example output: > > % perf list > ... > arith.fpu_div > [Divide operations executed] > arith.fpu_div_active > [Cycles when divider is busy executing divide operations] > > Signed-off-by: Andi Kleen > Signed-off-by: Sukadev Bhattiprolu > Acked-by: Jiri Olsa > Acked-by: Ingo Molnar > --- > > Changelog > - Delete a redundant free() > > Changelog[v14] > - [Jiri Olsa] Fail, rather than continue if strdup() returns NULL; > remove unnecessary __maybe_unused. > --- > tools/perf/util/pmu.c | 83 +++++++++++++++++++++++++++++++++++++++++---------- > tools/perf/util/pmu.h | 1 + > 2 files changed, 68 insertions(+), 16 deletions(-) > > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > index c842886..af1a612 100644 > --- a/tools/perf/util/pmu.c > +++ b/tools/perf/util/pmu.c > @@ -222,7 +222,7 @@ static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias, > } > > static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, > - char *desc __maybe_unused, char *val) > + char *desc, char *val) > { > struct perf_pmu_alias *alias; > int ret; > @@ -255,6 +255,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, > perf_pmu__parse_snapshot(alias, dir, name); > } > > + alias->desc = desc ? strdup(desc) : NULL; > + > list_add_tail(&alias->list, list); > > return 0; > @@ -1044,11 +1046,42 @@ static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu, > return buf; > } > > -static int cmp_string(const void *a, const void *b) > +struct pair { > + char *name; > + char *desc; > +}; > + > +static int cmp_pair(const void *a, const void *b) > +{ > + const struct pair *as = a; > + const struct pair *bs = b; > + > + /* Put extra events last */ > + if (!!as->desc != !!bs->desc) > + return !!as->desc - !!bs->desc; > + return strcmp(as->name, bs->name); > +} > + > +static void wordwrap(char *s, int start, int max, int corr) > { > - const char * const *as = a; > - const char * const *bs = b; > - return strcmp(*as, *bs); > + int column = start; > + int n; > + > + while (*s) { > + int wlen = strcspn(s, " \t"); > + > + if (column + wlen >= max && column > start) { > + printf("\n%*s", start, ""); > + column = start + corr; > + } > + n = printf("%s%.*s", column > start ? " " : "", wlen, s); > + if (n <= 0) > + break; > + s += wlen; > + column += n; > + while (isspace(*s)) > + s++; > + } > } > > void print_pmu_events(const char *event_glob, bool name_only) > @@ -1058,7 +1091,9 @@ void print_pmu_events(const char *event_glob, bool name_only) > char buf[1024]; > int printed = 0; > int len, j; > - char **aliases; > + struct pair *aliases; > + int numdesc = 0; > + int columns = 78; > > pmu = NULL; > len = 0; > @@ -1068,14 +1103,15 @@ void print_pmu_events(const char *event_glob, bool name_only) > if (pmu->selectable) > len++; > } > - aliases = zalloc(sizeof(char *) * len); > + aliases = zalloc(sizeof(struct pair) * len); > if (!aliases) > goto out_enomem; > pmu = NULL; > j = 0; > while ((pmu = perf_pmu__scan(pmu)) != NULL) { > list_for_each_entry(alias, &pmu->aliases, list) { > - char *name = format_alias(buf, sizeof(buf), pmu, alias); > + char *name = alias->desc ? alias->name : > + format_alias(buf, sizeof(buf), pmu, alias); > bool is_cpu = !strcmp(pmu->name, "cpu"); > > if (event_glob != NULL && > @@ -1084,12 +1120,19 @@ void print_pmu_events(const char *event_glob, bool name_only) > event_glob)))) > continue; > > - if (is_cpu && !name_only) > + if (is_cpu && !name_only && !alias->desc) > name = format_alias_or(buf, sizeof(buf), pmu, alias); > > - aliases[j] = strdup(name); > - if (aliases[j] == NULL) > + aliases[j].name = name; > + if (is_cpu && !name_only && !alias->desc) > + aliases[j].name = format_alias_or(buf, > + sizeof(buf), > + pmu, alias); > + aliases[j].name = strdup(aliases[j].name); > + if (!aliases[j].name) > goto out_enomem; > + > + aliases[j].desc = alias->desc; > j++; > } > if (pmu->selectable && > @@ -1097,25 +1140,33 @@ void print_pmu_events(const char *event_glob, bool name_only) > char *s; > if (asprintf(&s, "%s//", pmu->name) < 0) > goto out_enomem; > - aliases[j] = s; > + aliases[j].name = s; > j++; > } > } > len = j; > - qsort(aliases, len, sizeof(char *), cmp_string); > + qsort(aliases, len, sizeof(struct pair), cmp_pair); > for (j = 0; j < len; j++) { > if (name_only) { > - printf("%s ", aliases[j]); > + printf("%s ", aliases[j].name); > continue; > } > - printf(" %-50s [Kernel PMU event]\n", aliases[j]); > + if (aliases[j].desc) { > + if (numdesc++ == 0) > + printf("\n"); > + printf(" %-50s\n", aliases[j].name); > + printf("%*s", 8, "["); > + wordwrap(aliases[j].desc, 8, columns, 0); > + printf("]\n"); > + } else > + printf(" %-50s [Kernel PMU event]\n", aliases[j].name); > printed++; > } > if (printed && pager_in_use()) > printf("\n"); > out_free: > for (j = 0; j < len; j++) > - zfree(&aliases[j]); > + zfree(&aliases[j].name); > zfree(&aliases); > return; > > diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h > index 5d7e844..11bda57 100644 > --- a/tools/perf/util/pmu.h > +++ b/tools/perf/util/pmu.h > @@ -38,6 +38,7 @@ struct perf_pmu_info { > > struct perf_pmu_alias { > char *name; > + char *desc; > struct list_head terms; /* HEAD struct parse_events_term -> list */ > struct list_head list; /* ELEM */ > char unit[UNIT_MAX_LEN+1]; > -- > 1.8.3.1