Messages in this thread Patch in this message | | | Date | Mon, 19 Oct 2015 17:45:02 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH 05/57] perf tools: Add cpu_map event |
| |
Em Fri, Oct 16, 2015 at 12:40:40PM +0200, Jiri Olsa escreveu: > Adding cpu_map event to pass/store cpu maps > as data in 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 following patch. > > The interface is made generic, so we could add > cpumap event data into another event in following > patches.
Hey, perf_event_header.size is u16, so max is 65535, which with each cpu taking 8 bytes... We this we can't support > ~8190 CPUs with PERF_CPU_MAP__CPUS.
Do we really need to use u64 for each CPU entry?
- Arnaldo > Link: http://lkml.kernel.org/n/tip-tomgwwohnuxvvalwu4znaa2o@git.kernel.org > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/perf/util/event.c | 1 + > tools/perf/util/event.h | 28 ++++++++++++++++++++++++++ > tools/perf/util/session.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++ > tools/perf/util/tool.h | 3 ++- > 4 files changed, 81 insertions(+), 1 deletion(-) > > diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c > index ec2965b139a4..c05f4b036069 100644 > --- a/tools/perf/util/event.c > +++ b/tools/perf/util/event.c > @@ -38,6 +38,7 @@ static const char *perf_event__names[] = { > [PERF_RECORD_AUXTRACE] = "AUXTRACE", > [PERF_RECORD_AUXTRACE_ERROR] = "AUXTRACE_ERROR", > [PERF_RECORD_THREAD_MAP] = "THREAD_MAP", > + [PERF_RECORD_CPU_MAP] = "CPU_MAP", > }; > > const char *perf_event__name(unsigned int id) > diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h > index 75157f3b16fb..7dcbd7f5b68c 100644 > --- a/tools/perf/util/event.h > +++ b/tools/perf/util/event.h > @@ -227,6 +227,7 @@ enum perf_user_event_type { /* above any possible kernel type */ > PERF_RECORD_AUXTRACE = 71, > PERF_RECORD_AUXTRACE_ERROR = 72, > PERF_RECORD_THREAD_MAP = 73, > + PERF_RECORD_CPU_MAP = 74, > PERF_RECORD_HEADER_MAX > }; > > @@ -271,6 +272,32 @@ struct events_stats { > u32 nr_proc_map_timeout; > }; > > +enum { > + PERF_CPU_MAP__CPUS = 0, > + PERF_CPU_MAP__MASK = 1, > +}; > + > +struct cpu_map_data_cpus { > + u64 nr; > + u64 cpu[]; > +}; > + > +struct cpu_map_data_mask { > + u64 nr; > + u64 long_size; > + unsigned long mask[]; > +}; > + > +struct cpu_map_data { > + u64 type; > + char data[]; > +}; > + > +struct cpu_map_event { > + struct perf_event_header header; > + struct cpu_map_data data; > +}; > + > struct attr_event { > struct perf_event_header header; > struct perf_event_attr attr; > @@ -391,6 +418,7 @@ union perf_event { > struct itrace_start_event itrace_start; > struct context_switch_event context_switch; > struct thread_map_event thread_map; > + struct cpu_map_event cpu_map; > }; > > void perf_event__print_totals(void); > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c > index ec1ecd31003b..f4554bc43cce 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, > return 0; > } > > +static > +int process_event_cpu_map_stub(struct perf_tool *tool __maybe_unused, > + union perf_event *event __maybe_unused, > + struct perf_session *session __maybe_unused) > +{ > + dump_printf(": unhandled!\n"); > + return 0; > +} > + > void perf_tool__fill_defaults(struct perf_tool *tool) > { > if (tool->sample == NULL) > @@ -358,6 +367,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool) > tool->auxtrace_error = process_event_auxtrace_error_stub; > if (tool->thread_map == NULL) > tool->thread_map = process_event_thread_map_stub; > + if (tool->cpu_map == NULL) > + tool->cpu_map = process_event_cpu_map_stub; > } > > static 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, > event->thread_map.data[i].pid = bswap_64(event->thread_map.data[i].pid); > } > > +static void perf_event__cpu_map_swap(union perf_event *event, > + bool sample_id_all __maybe_unused) > +{ > + struct cpu_map_data *data = &event->cpu_map.data; > + struct cpu_map_data_cpus *cpus; > + struct cpu_map_data_mask *mask; > + unsigned i; > + > + data->type = bswap_64(data->type); > + > + switch (data->type) { > + case PERF_CPU_MAP__CPUS: > + cpus = (struct cpu_map_data_cpus*) data->data; > + > + cpus->nr = bswap_64(cpus->nr); > + > + for (i = 0; i < cpus->nr; i++) > + cpus->cpu[i] = bswap_64(cpus->cpu[i]); > + break; > + case PERF_CPU_MAP__MASK: > + mask = (struct cpu_map_data_mask*) data->data; > + > + mask->nr = bswap_64(mask->nr); > + mask->long_size = bswap_64(mask->long_size); > + > + switch (mask->long_size) { > + case 4: mem_bswap_32(&mask->mask, mask->nr); break; > + case 8: mem_bswap_64(&mask->mask, mask->nr); break; > + default: > + pr_err("cpu_map swap: unsupported long size\n"); > + } > + default: > + break; > + } > +} > + > typedef void (*perf_event__swap_op)(union perf_event *event, > bool sample_id_all); > > @@ -667,6 +714,7 @@ static perf_event__swap_op perf_event__swap_ops[] = { > [PERF_RECORD_AUXTRACE] = perf_event__auxtrace_swap, > [PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap, > [PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap, > + [PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap, > [PERF_RECORD_HEADER_MAX] = NULL, > }; > > @@ -1205,6 +1253,8 @@ static s64 perf_session__process_user_event(struct perf_session *session, > return tool->auxtrace_error(tool, event, session); > case PERF_RECORD_THREAD_MAP: > return tool->thread_map(tool, event, session); > + case PERF_RECORD_CPU_MAP: > + return tool->cpu_map(tool, event, session); > default: > return -EINVAL; > } > diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h > index 1af4774960c3..9e5925c78519 100644 > --- a/tools/perf/util/tool.h > +++ b/tools/perf/util/tool.h > @@ -56,7 +56,8 @@ struct perf_tool { > id_index, > auxtrace_info, > auxtrace_error, > - thread_map; > + thread_map, > + cpu_map; > event_op3 auxtrace; > bool ordered_events; > bool ordering_requires_timestamps; > -- > 2.4.3
| |