On Mon, Oct 19, 2015 at 05:45:02PM -0300, Arnaldo Carvalho de Melo wrote: > 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?
64 bits for cpu number should be ok for future ;-) as I stated above there are 2 ways to save cpu map - list od cpus - mask of cpus and the one taking less bytes is chosen.. but I agree 8 bytes for cpu number is little too much.. will change jirka > > - Arnaldo > > > Link: http://lkml.kernel.org/n/[email protected] > > Signed-off-by: Jiri Olsa <[email protected]> > > --- > > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

