On Fri, Jun 27, 2014 at 04:15:57PM -0700, Andi Kleen wrote:
> From: Andi Kleen <a...@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 <namhy...@kernel.org>
> Signed-off-by: Andi Kleen <a...@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
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to