Messages in this thread Patch in this message | | | From | Jiri Olsa <> | Subject | [PATCH 23/57] perf tools: Add attr_update event cpus type | Date | Fri, 16 Oct 2015 12:40:58 +0200 |
| |
Adding cpumask attr update event, that stores/transfer cpumask for event.
Link: http://lkml.kernel.org/n/tip-wm844j3ht4isjn2elinc09rk@git.kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- tools/perf/tests/attr_update.c | 30 ++++++++++++++++++++++++++++++ tools/perf/util/event.h | 5 +++++ tools/perf/util/header.c | 42 ++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/header.h | 3 +++ 4 files changed, 80 insertions(+)
diff --git a/tools/perf/tests/attr_update.c b/tools/perf/tests/attr_update.c index a88c0d7d9d08..09e0c4533191 100644 --- a/tools/perf/tests/attr_update.c +++ b/tools/perf/tests/attr_update.c @@ -53,6 +53,30 @@ static int process_event_name(struct perf_tool *tool, return 0; } +static int process_event_cpus(struct perf_tool *tool __maybe_unused, + union perf_event *event, + struct perf_sample *sample __maybe_unused, + struct machine *machine __maybe_unused) +{ + struct attr_update_event *ev = (struct attr_update_event*) event; + struct attr_update_event_cpus *ev_data; + struct cpu_map *map; + + ev_data = (struct attr_update_event_cpus*) ev->data; + + map = cpu_map__new_data(&ev_data->cpus); + + TEST_ASSERT_VAL("wrong id", ev->id == 123); + TEST_ASSERT_VAL("wrong type", ev->type == PERF_ATTR_UPDATE__CPUS); + TEST_ASSERT_VAL("wrong cpus", map->nr == 3); + TEST_ASSERT_VAL("wrong cpus", map->map[0] == 1); + TEST_ASSERT_VAL("wrong cpus", map->map[1] == 2); + TEST_ASSERT_VAL("wrong cpus", map->map[2] == 3); + cpu_map__put(map); + return 0; +} + + int test__attr_update(void) { struct perf_evlist *evlist; @@ -84,5 +108,11 @@ int test__attr_update(void) TEST_ASSERT_VAL("failed to synthesize attr update name", !perf_event__synthesize_attr_update_name(&tmp.tool, evsel, process_event_name)); + evsel->own_cpus = cpu_map__new("1,2,3"); + + TEST_ASSERT_VAL("failed to synthesize attr update cpus", + !perf_event__synthesize_attr_update_cpus(&tmp.tool, evsel, process_event_cpus)); + + cpu_map__put(evsel->own_cpus); return 0; } diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 066429535349..ae8e49145f62 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -313,6 +313,11 @@ enum { PERF_ATTR_UPDATE__UNIT = 0, PERF_ATTR_UPDATE__SCALE = 1, PERF_ATTR_UPDATE__NAME = 2, + PERF_ATTR_UPDATE__CPUS = 3, +}; + +struct attr_update_event_cpus { + struct cpu_map_data cpus; }; struct attr_update_event_scale { diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 1516e7146b84..83c3bbd05b80 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -2762,6 +2762,38 @@ perf_event__synthesize_attr_update_name(struct perf_tool *tool, return err; } +int +perf_event__synthesize_attr_update_cpus(struct perf_tool *tool, + struct perf_evsel *evsel, + perf_event__handler_t process) +{ + size_t size = sizeof(struct attr_update_event); + struct attr_update_event *ev; + int max, err; + u64 type; + + if (!evsel->own_cpus) + return 0; + + ev = cpu_map_data__alloc(evsel->own_cpus, &size, &type, &max); + if (!ev) + return -ENOMEM; + + ev->header.type = PERF_RECORD_HEADER_ATTR_UPDATE; + ev->header.size = (u16)size; + ev->type = PERF_ATTR_UPDATE__CPUS; + ev->id = evsel->id[0]; + + cpu_map_data__synthesize((struct cpu_map_data *) ev->data, + evsel->own_cpus, + type, max); + + err = process(tool, (union perf_event*) ev, NULL, NULL); + free(ev); + return err; +} + + int perf_event__synthesize_attrs(struct perf_tool *tool, struct perf_session *session, perf_event__handler_t process) @@ -2827,8 +2859,10 @@ int perf_event__process_attr_update(struct perf_tool *tool __maybe_unused, { struct attr_update_event *ev = &event->attr_update; struct attr_update_event_scale *ev_scale; + struct attr_update_event_cpus *ev_cpus; struct perf_evlist *evlist; struct perf_evsel *evsel; + struct cpu_map *map; if (!pevlist || *pevlist == NULL) return -EINVAL; @@ -2849,6 +2883,14 @@ int perf_event__process_attr_update(struct perf_tool *tool __maybe_unused, case PERF_ATTR_UPDATE__SCALE: ev_scale = (struct attr_update_event_scale *) ev->data; evsel->scale = ev_scale->scale; + case PERF_ATTR_UPDATE__CPUS: + ev_cpus = (struct attr_update_event_cpus *) ev->data; + + map = cpu_map__new_data(&ev_cpus->cpus); + if (map) + evsel->own_cpus = map; + else + pr_err("failed to get attr_update cpus\n"); default: break; } diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index cb538ade38d3..db673b0cef41 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h @@ -114,6 +114,9 @@ int perf_event__synthesize_attr_update_scale(struct perf_tool *tool, int perf_event__synthesize_attr_update_name(struct perf_tool *tool, struct perf_evsel *evsel, perf_event__handler_t process); +int perf_event__synthesize_attr_update_cpus(struct perf_tool *tool, + struct perf_evsel *evsel, + perf_event__handler_t process); int perf_event__process_attr(struct perf_tool *tool, union perf_event *event, struct perf_evlist **pevlist); int perf_event__process_attr_update(struct perf_tool *tool __maybe_unused, -- 2.4.3
| |