Messages in this thread Patch in this message | | | From | Jiri Olsa <> | Subject | [PATCH 13/14] perf tests: Add parse metric test for ipc metric | Date | Mon, 25 May 2020 00:42:18 +0200 |
| |
Adding new test that process metrics code and checks the expected results. Starting with easy ipc metric.
Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 4 ++ tools/perf/tests/parse-metric.c | 117 ++++++++++++++++++++++++++++++++ tools/perf/tests/tests.h | 1 + 4 files changed, 123 insertions(+) create mode 100644 tools/perf/tests/parse-metric.c
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build index c75557aeef0e..bb7c2d8364d1 100644 --- a/tools/perf/tests/Build +++ b/tools/perf/tests/Build @@ -57,6 +57,7 @@ perf-y += maps.o perf-y += time-utils-test.o perf-y += genelf.o perf-y += api-io.o +perf-y += parse-metric.o $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build $(call rule_mkdir) diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index a9daaeb9fd27..bf20abdca0b0 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -324,6 +324,10 @@ static struct test generic_tests[] = { .desc = "maps__merge_in", .func = test__maps__merge_in, }, + { + .desc = "Parse and process metrics", + .func = test__parse_metric, + }, { .func = NULL, }, diff --git a/tools/perf/tests/parse-metric.c b/tools/perf/tests/parse-metric.c new file mode 100644 index 000000000000..3005d27c5c48 --- /dev/null +++ b/tools/perf/tests/parse-metric.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/compiler.h> +#include <string.h> +#include "metricgroup.h" +#include "tests.h" +#include "pmu-events/pmu-events.h" +#include "evlist.h" +#include "rblist.h" +#include "debug.h" +#include "expr.h" +#include "stat.h" + +static struct pmu_event pme_test[] = { +{ + .metric_expr = "inst_retired.any / cpu_clk_unhalted.thread", + .metric_name = "IPC", +}, +}; + +static struct pmu_events_map map = { + .cpuid = "test", + .version = "1", + .type = "core", + .table = pme_test, +}; + +static double compute_single(struct rblist *metric_events, struct evsel *evsel, + struct runtime_stat *st) +{ + struct metric_event *me; + + me = metricgroup__lookup(metric_events, evsel, false); + if (me != NULL) { + struct metric_expr *mexp; + + mexp = list_first_entry(&me->head, struct metric_expr, nd); + return test_generic_metric(mexp, 0, st); + } + + return 0.; +} + +struct value { + const char *event; + u64 val; +}; + +static u64 find_value(const char *name, struct value *values) +{ + struct value *v = values; + + while (v->event) { + if (!strcmp(name, v->event)) + return v->val; + v++; + }; + + return 0; +} + +static void load_runtime_stat(struct runtime_stat *st, struct evlist *evlist, + struct value *values) +{ + struct evsel *evsel; + u64 count; + + evlist__for_each_entry(evlist, evsel) { + count = find_value(evsel->name, values); + perf_stat__update_shadow_stats(evsel, count, 0, st); + } +} + +static int test_ipc(void) +{ + double ratio; + struct rblist metric_events = { + .nr_entries = 0, + }; + struct evlist *evlist; + struct evsel *evsel; + struct value vals[] = { + { .event = "inst_retired.any", .val = 300 }, + { .event = "cpu_clk_unhalted.thread", .val = 200 }, + { 0 }, + }; + struct runtime_stat st; + int err; + + evlist = evlist__new(); + if (!evlist) + return -1; + + err = metricgroup__parse_groups_test(evlist, &map, + "IPC", + false, false, + &metric_events); + + TEST_ASSERT_VAL("failed to parse metrics", err == 0); + + runtime_stat__init(&st); + load_runtime_stat(&st, evlist, vals); + + evsel = evlist__first(evlist); + ratio = compute_single(&metric_events, evsel, &st); + + TEST_ASSERT_VAL("IPC failed, wrong ratio", ratio == 1.5); + + runtime_stat__exit(&st); + evlist__delete(evlist); + return 0; +} + +int test__parse_metric(struct test *test __maybe_unused, int subtest __maybe_unused) +{ + TEST_ASSERT_VAL("IPC failed", test_ipc() == 0); + return 0; +} diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index 6c6c4b6a4796..0a7853b72240 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -117,6 +117,7 @@ int test__maps__merge_in(struct test *t, int subtest); int test__time_utils(struct test *t, int subtest); int test__jit_write_elf(struct test *test, int subtest); int test__api_io(struct test *test, int subtest); +int test__parse_metric(struct test *test, int subtest); bool test__bp_signal_is_supported(void); bool test__bp_account_is_supported(void); -- 2.25.4
| |