From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755814AbbJVH5L (ORCPT ); Thu, 22 Oct 2015 03:57:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59668 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750961AbbJVH5H (ORCPT ); Thu, 22 Oct 2015 03:57:07 -0400 Date: Thu, 22 Oct 2015 09:56:03 +0200 From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , lkml , David Ahern , Ingo Molnar , Namhyung Kim , Peter Zijlstra , "Liang, Kan" Subject: Re: [PATCH 05/57] perf tools: Add cpu_map event Message-ID: <20151022075603.GA29953@krava.redhat.com> References: <1444992092-17897-1-git-send-email-jolsa@kernel.org> <1444992092-17897-6-git-send-email-jolsa@kernel.org> <20151019204502.GE3215@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151019204502.GE3215@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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/tip-tomgwwohnuxvvalwu4znaa2o@git.kernel.org > > Signed-off-by: Jiri Olsa > > --- > > 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