lkml.org 
[lkml]   [2014]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 2/9] perf, tools: Add support for text descriptions of events and alias add
    On Fri, Jun 27, 2014 at 04:15:57PM -0700, Andi Kleen wrote:
    > From: Andi Kleen <ak@linux.intel.com>
    >
    > Change pmu.c to allow descriptions of events and add interfaces
    > to add aliases at runtime from another file. To be used by jevents in the
    > next patch.
    >
    > Acked-by: Namhyung Kim <namhyung@kernel.org>
    > Signed-off-by: Andi Kleen <ak@linux.intel.com>

    SNIP

    > + return __perf_pmu__new_alias(list, name, dir, NULL, buf);
    > +}
    > +
    > /*
    > * Process all the sysfs attributes located under the directory
    > * specified in 'dir' parameter.
    > @@ -720,11 +737,51 @@ static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu,
    > return buf;
    > }

    changes below, the list command update should be separated patch

    jirka

    >
    > -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 downloaded event list 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++;
    > + }
    > +}
    > +
    > +static int get_columns(void)
    > +{
    > + /*
    > + * Should ask the terminal with TIOCGWINSZ here, but we
    > + * need the original fd before the pager.
    > + */
    > + return 79;
    > }
    >
    > void print_pmu_events(const char *event_glob, bool name_only)
    > @@ -734,21 +791,24 @@ 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 = get_columns();
    >
    > pmu = NULL;
    > len = 0;
    > while ((pmu = perf_pmu__scan(pmu)) != NULL)
    > list_for_each_entry(alias, &pmu->aliases, list)
    > len++;
    > - aliases = malloc(sizeof(char *) * len);
    > + aliases = malloc(sizeof(struct pair) * len);
    > if (!aliases)
    > return;
    > 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 &&
    > @@ -756,22 +816,31 @@ void print_pmu_events(const char *event_glob, bool name_only)
    > (!is_cpu && strglobmatch(alias->name,
    > event_glob))))
    > continue;
    > - aliases[j] = name;
    > - if (is_cpu && !name_only)
    > - aliases[j] = format_alias_or(buf, sizeof(buf),
    > - pmu, alias);
    > - aliases[j] = strdup(aliases[j]);
    > + 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);
    > + aliases[j].desc = alias->desc;
    > 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]);
    > - zfree(&aliases[j]);
    > + if (aliases[j].desc) {
    > + if (numdesc++ == 0 && printed)
    > + printf("\n");
    > + printf(" %-50s [", aliases[j].name);
    > + wordwrap(aliases[j].desc, 53, columns, 1);
    > + printf("]\n");
    > + } else
    > + printf(" %-50s [Kernel PMU event]\n", aliases[j].name);
    > + zfree(&aliases[j].name);
    > printed++;
    > }
    > if (printed)
    > --
    > 1.9.3
    >


    \
     
     \ /
      Last update: 2014-07-10 01:01    [W:4.662 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site