lkml.org 
[lkml]   [2015]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/43] perf tools: Add stat event synthesize function
    Date
    From: Jiri Olsa <jolsa@kernel.org>

    Introduce the perf_event__synthesize_stat function to synthesize a
    'struct stat_event'.

    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Tested-by: Kan Liang <kan.liang@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/1445784728-21732-16-git-send-email-jolsa@kernel.org
    [ Renamed 'stat' parameter to 'st' to fix 'already defined' build error with older distros (e.g. RHEL6.7) ]
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/tests/builtin-test.c | 4 ++++
    tools/perf/tests/stat.c | 41 ++++++++++++++++++++++++++++++++++++-----
    tools/perf/tests/tests.h | 1 +
    tools/perf/util/event.c | 22 ++++++++++++++++++++++
    tools/perf/util/event.h | 7 ++++++-
    5 files changed, 69 insertions(+), 6 deletions(-)

    diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
    index ed8402f339fa..4a7d9989e1c3 100644
    --- a/tools/perf/tests/builtin-test.c
    +++ b/tools/perf/tests/builtin-test.c
    @@ -192,6 +192,10 @@ static struct test generic_tests[] = {
    .func = test__synthesize_stat_config,
    },
    {
    + .desc = "Test stat synthesize",
    + .func = test__synthesize_stat,
    + },
    + {
    .func = NULL,
    },
    };
    diff --git a/tools/perf/tests/stat.c b/tools/perf/tests/stat.c
    index aa35d28294a0..d319875a5e7c 100644
    --- a/tools/perf/tests/stat.c
    +++ b/tools/perf/tests/stat.c
    @@ -2,6 +2,7 @@
    #include "event.h"
    #include "tests.h"
    #include "stat.h"
    +#include "counts.h"
    #include "debug.h"

    static bool has_term(struct stat_config_event *config,
    @@ -18,10 +19,10 @@ static bool has_term(struct stat_config_event *config,
    return false;
    }

    -static int process_event(struct perf_tool *tool __maybe_unused,
    - union perf_event *event,
    - struct perf_sample *sample __maybe_unused,
    - struct machine *machine __maybe_unused)
    +static int process_stat_config_event(struct perf_tool *tool __maybe_unused,
    + union perf_event *event,
    + struct perf_sample *sample __maybe_unused,
    + struct machine *machine __maybe_unused)
    {
    struct stat_config_event *config = &event->stat_config;
    struct perf_stat_config stat_config;
    @@ -53,7 +54,37 @@ int test__synthesize_stat_config(int subtest __maybe_unused)
    };

    TEST_ASSERT_VAL("failed to synthesize stat_config",
    - !perf_event__synthesize_stat_config(NULL, &stat_config, process_event, NULL));
    + !perf_event__synthesize_stat_config(NULL, &stat_config, process_stat_config_event, NULL));
    +
    + return 0;
    +}
    +
    +static int process_stat_event(struct perf_tool *tool __maybe_unused,
    + union perf_event *event,
    + struct perf_sample *sample __maybe_unused,
    + struct machine *machine __maybe_unused)
    +{
    + struct stat_event *st = &event->stat;
    +
    + TEST_ASSERT_VAL("wrong cpu", st->cpu == 1);
    + TEST_ASSERT_VAL("wrong thread", st->thread == 2);
    + TEST_ASSERT_VAL("wrong id", st->id == 3);
    + TEST_ASSERT_VAL("wrong val", st->val == 100);
    + TEST_ASSERT_VAL("wrong run", st->ena == 200);
    + TEST_ASSERT_VAL("wrong ena", st->run == 300);
    + return 0;
    +}
    +
    +int test__synthesize_stat(int subtest __maybe_unused)
    +{
    + struct perf_counts_values count;
    +
    + count.val = 100;
    + count.ena = 200;
    + count.run = 300;
    +
    + TEST_ASSERT_VAL("failed to synthesize stat_config",
    + !perf_event__synthesize_stat(NULL, 1, 2, 3, &count, process_stat_event, NULL));

    return 0;
    }
    diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
    index 319757a3ca69..d36eda17a5f5 100644
    --- a/tools/perf/tests/tests.h
    +++ b/tools/perf/tests/tests.h
    @@ -82,6 +82,7 @@ int test_session_topology(int subtest);
    int test__thread_map_synthesize(int subtest);
    int test__cpu_map_synthesize(int subtest);
    int test__synthesize_stat_config(int subtest);
    +int test__synthesize_stat(int subtest);

    #if defined(__arm__) || defined(__aarch64__)
    #ifdef HAVE_DWARF_UNWIND_SUPPORT
    diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
    index 670123fee60a..eb8243ab6ab1 100644
    --- a/tools/perf/util/event.c
    +++ b/tools/perf/util/event.c
    @@ -910,6 +910,28 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
    return err;
    }

    +int perf_event__synthesize_stat(struct perf_tool *tool,
    + u32 cpu, u32 thread, u64 id,
    + struct perf_counts_values *count,
    + perf_event__handler_t process,
    + struct machine *machine)
    +{
    + struct stat_event event;
    +
    + event.header.type = PERF_RECORD_STAT;
    + event.header.size = sizeof(event);
    + event.header.misc = 0;
    +
    + event.id = id;
    + event.cpu = cpu;
    + event.thread = thread;
    + event.val = count->val;
    + event.ena = count->ena;
    + event.run = count->run;
    +
    + return process(tool, (union perf_event *) &event, NULL, machine);
    +}
    +
    void perf_event__read_stat_config(struct perf_stat_config *config,
    struct stat_config_event *event)
    {
    diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
    index f23f464c680a..336eb44babf8 100644
    --- a/tools/perf/util/event.h
    +++ b/tools/perf/util/event.h
    @@ -466,6 +466,7 @@ struct perf_tool;
    struct thread_map;
    struct cpu_map;
    struct perf_stat_config;
    +struct perf_counts_values;

    typedef int (*perf_event__handler_t)(struct perf_tool *tool,
    union perf_event *event,
    @@ -498,7 +499,11 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
    struct machine *machine);
    void perf_event__read_stat_config(struct perf_stat_config *config,
    struct stat_config_event *event);
    -
    +int perf_event__synthesize_stat(struct perf_tool *tool,
    + u32 cpu, u32 thread, u64 id,
    + struct perf_counts_values *count,
    + perf_event__handler_t process,
    + struct machine *machine);
    int perf_event__synthesize_modules(struct perf_tool *tool,
    perf_event__handler_t process,
    struct machine *machine);
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-12-17 21:21    [W:4.155 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site