lkml.org 
[lkml]   [2011]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/25] perf evlist: Introduce perf_evlist__add_attrs
    Date
    From: Arnaldo Carvalho de Melo <acme@redhat.com>

    Replacing the open coded equivalents in 'perf stat'.

    Cc: David Ahern <dsahern@gmail.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Link: http://lkml.kernel.org/n/tip-1btwadnf2tds2g07hsccsdse@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/builtin-stat.c | 40 +++++++---------------------------------
    tools/perf/util/evlist.c | 34 ++++++++++++++++++++++++++++++++++
    tools/perf/util/evlist.h | 7 +++++++
    3 files changed, 48 insertions(+), 33 deletions(-)

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index 7d98676..227befb 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -1107,22 +1107,13 @@ static const struct option options[] = {
    */
    static int add_default_attributes(void)
    {
    - struct perf_evsel *pos;
    - size_t attr_nr = 0;
    - size_t c;
    -
    /* Set attrs if no event is selected and !null_run: */
    if (null_run)
    return 0;

    if (!evsel_list->nr_entries) {
    - for (c = 0; c < ARRAY_SIZE(default_attrs); c++) {
    - pos = perf_evsel__new(default_attrs + c, c + attr_nr);
    - if (pos == NULL)
    - return -1;
    - perf_evlist__add(evsel_list, pos);
    - }
    - attr_nr += c;
    + if (perf_evlist__add_attrs_array(evsel_list, default_attrs) < 0)
    + return -1;
    }

    /* Detailed events get appended to the event list: */
    @@ -1131,38 +1122,21 @@ static int add_default_attributes(void)
    return 0;

    /* Append detailed run extra attributes: */
    - for (c = 0; c < ARRAY_SIZE(detailed_attrs); c++) {
    - pos = perf_evsel__new(detailed_attrs + c, c + attr_nr);
    - if (pos == NULL)
    - return -1;
    - perf_evlist__add(evsel_list, pos);
    - }
    - attr_nr += c;
    + if (perf_evlist__add_attrs_array(evsel_list, detailed_attrs) < 0)
    + return -1;

    if (detailed_run < 2)
    return 0;

    /* Append very detailed run extra attributes: */
    - for (c = 0; c < ARRAY_SIZE(very_detailed_attrs); c++) {
    - pos = perf_evsel__new(very_detailed_attrs + c, c + attr_nr);
    - if (pos == NULL)
    - return -1;
    - perf_evlist__add(evsel_list, pos);
    - }
    + if (perf_evlist__add_attrs_array(evsel_list, very_detailed_attrs) < 0)
    + return -1;

    if (detailed_run < 3)
    return 0;

    /* Append very, very detailed run extra attributes: */
    - for (c = 0; c < ARRAY_SIZE(very_very_detailed_attrs); c++) {
    - pos = perf_evsel__new(very_very_detailed_attrs + c, c + attr_nr);
    - if (pos == NULL)
    - return -1;
    - perf_evlist__add(evsel_list, pos);
    - }
    -
    -
    - return 0;
    + return perf_evlist__add_attrs_array(evsel_list, very_very_detailed_attrs);
    }

    int cmd_stat(int argc, const char **argv, const char *prefix __used)
    diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
    index fbb4b4a..58aa1e0 100644
    --- a/tools/perf/util/evlist.c
    +++ b/tools/perf/util/evlist.c
    @@ -13,6 +13,8 @@
    #include "evsel.h"
    #include "util.h"

    +#include "parse-events.h"
    +
    #include <sys/mman.h>

    #include <linux/bitops.h>
    @@ -76,6 +78,14 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
    ++evlist->nr_entries;
    }

    +static void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
    + struct list_head *list,
    + int nr_entries)
    +{
    + list_splice_tail(list, &evlist->entries);
    + evlist->nr_entries += nr_entries;
    +}
    +
    int perf_evlist__add_default(struct perf_evlist *evlist)
    {
    struct perf_event_attr attr = {
    @@ -100,6 +110,30 @@ error:
    return -ENOMEM;
    }

    +int perf_evlist__add_attrs(struct perf_evlist *evlist,
    + struct perf_event_attr *attrs, size_t nr_attrs)
    +{
    + struct perf_evsel *evsel, *n;
    + LIST_HEAD(head);
    + size_t i;
    +
    + for (i = 0; i < nr_attrs; i++) {
    + evsel = perf_evsel__new(attrs + i, evlist->nr_entries + i);
    + if (evsel == NULL)
    + goto out_delete_partial_list;
    + list_add_tail(&evsel->node, &head);
    + }
    +
    + perf_evlist__splice_list_tail(evlist, &head, nr_attrs);
    +
    + return 0;
    +
    +out_delete_partial_list:
    + list_for_each_entry_safe(evsel, n, &head, node)
    + perf_evsel__delete(evsel);
    + return -1;
    +}
    +
    void perf_evlist__disable(struct perf_evlist *evlist)
    {
    int cpu, thread;
    diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
    index 1779ffe..57d91ff 100644
    --- a/tools/perf/util/evlist.h
    +++ b/tools/perf/util/evlist.h
    @@ -2,8 +2,10 @@
    #define __PERF_EVLIST_H 1

    #include <linux/list.h>
    +#include <stdio.h>
    #include "../perf.h"
    #include "event.h"
    +#include "util.h"

    struct pollfd;
    struct thread_map;
    @@ -39,6 +41,11 @@ void perf_evlist__delete(struct perf_evlist *evlist);

    void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
    int perf_evlist__add_default(struct perf_evlist *evlist);
    +int perf_evlist__add_attrs(struct perf_evlist *evlist,
    + struct perf_event_attr *attrs, size_t nr_attrs);
    +
    +#define perf_evlist__add_attrs_array(evlist, array) \
    + perf_evlist__add_attrs(evlist, array, ARRAY_SIZE(array))

    void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
    int cpu, int thread, u64 id);
    --
    1.7.8.rc0.35.gee6df


    \
     
     \ /
      Last update: 2011-11-29 00:21    [W:0.031 / U:0.464 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site