aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2015-10-25 10:51:23 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-12-17 12:38:17 -0500
commit6640b6c227fc85fd8bdcc4a31239a04450487f6a (patch)
tree940373398494f0033409dbb644b6debb06717595 /tools/perf/util/session.c
parentec7fa596f514b76a5f1003ffe9e6dfb50cb9e811 (diff)
perf cpu_map: Add cpu_map user level event
Adding the cpu_map event to pass/store cpu maps as data in a pipe/perf.data. We store maps in 2 formats: - list of cpus - mask of cpus The format that takes less space is selected transparently in the following patch. The interface is made generic, so we could add the cpumap event data into another event in the following patches. 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-8-git-send-email-jolsa@kernel.org [ cpu_map_data_cpus -> cpu_map_entries, cpu_map_data_mask -> cpu_map_mask ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 36b07b22392d..4350f5e85bf5 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -306,6 +306,15 @@ int process_event_thread_map_stub(struct perf_tool *tool __maybe_unused,
306 return 0; 306 return 0;
307} 307}
308 308
309static
310int process_event_cpu_map_stub(struct perf_tool *tool __maybe_unused,
311 union perf_event *event __maybe_unused,
312 struct perf_session *session __maybe_unused)
313{
314 dump_printf(": unhandled!\n");
315 return 0;
316}
317
309void perf_tool__fill_defaults(struct perf_tool *tool) 318void perf_tool__fill_defaults(struct perf_tool *tool)
310{ 319{
311 if (tool->sample == NULL) 320 if (tool->sample == NULL)
@@ -358,6 +367,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
358 tool->auxtrace_error = process_event_auxtrace_error_stub; 367 tool->auxtrace_error = process_event_auxtrace_error_stub;
359 if (tool->thread_map == NULL) 368 if (tool->thread_map == NULL)
360 tool->thread_map = process_event_thread_map_stub; 369 tool->thread_map = process_event_thread_map_stub;
370 if (tool->cpu_map == NULL)
371 tool->cpu_map = process_event_cpu_map_stub;
361} 372}
362 373
363static void swap_sample_id_all(union perf_event *event, void *data) 374static void swap_sample_id_all(union perf_event *event, void *data)
@@ -639,6 +650,42 @@ static void perf_event__thread_map_swap(union perf_event *event,
639 event->thread_map.entries[i].pid = bswap_64(event->thread_map.entries[i].pid); 650 event->thread_map.entries[i].pid = bswap_64(event->thread_map.entries[i].pid);
640} 651}
641 652
653static void perf_event__cpu_map_swap(union perf_event *event,
654 bool sample_id_all __maybe_unused)
655{
656 struct cpu_map_data *data = &event->cpu_map.data;
657 struct cpu_map_entries *cpus;
658 struct cpu_map_mask *mask;
659 unsigned i;
660
661 data->type = bswap_64(data->type);
662
663 switch (data->type) {
664 case PERF_CPU_MAP__CPUS:
665 cpus = (struct cpu_map_entries *)data->data;
666
667 cpus->nr = bswap_16(cpus->nr);
668
669 for (i = 0; i < cpus->nr; i++)
670 cpus->cpu[i] = bswap_16(cpus->cpu[i]);
671 break;
672 case PERF_CPU_MAP__MASK:
673 mask = (struct cpu_map_mask *) data->data;
674
675 mask->nr = bswap_16(mask->nr);
676 mask->long_size = bswap_16(mask->long_size);
677
678 switch (mask->long_size) {
679 case 4: mem_bswap_32(&mask->mask, mask->nr); break;
680 case 8: mem_bswap_64(&mask->mask, mask->nr); break;
681 default:
682 pr_err("cpu_map swap: unsupported long size\n");
683 }
684 default:
685 break;
686 }
687}
688
642typedef void (*perf_event__swap_op)(union perf_event *event, 689typedef void (*perf_event__swap_op)(union perf_event *event,
643 bool sample_id_all); 690 bool sample_id_all);
644 691
@@ -667,6 +714,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
667 [PERF_RECORD_AUXTRACE] = perf_event__auxtrace_swap, 714 [PERF_RECORD_AUXTRACE] = perf_event__auxtrace_swap,
668 [PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap, 715 [PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap,
669 [PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap, 716 [PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap,
717 [PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
670 [PERF_RECORD_HEADER_MAX] = NULL, 718 [PERF_RECORD_HEADER_MAX] = NULL,
671}; 719};
672 720
@@ -1205,6 +1253,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
1205 return tool->auxtrace_error(tool, event, session); 1253 return tool->auxtrace_error(tool, event, session);
1206 case PERF_RECORD_THREAD_MAP: 1254 case PERF_RECORD_THREAD_MAP:
1207 return tool->thread_map(tool, event, session); 1255 return tool->thread_map(tool, event, session);
1256 case PERF_RECORD_CPU_MAP:
1257 return tool->cpu_map(tool, event, session);
1208 default: 1258 default:
1209 return -EINVAL; 1259 return -EINVAL;
1210 } 1260 }