From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754115AbdBTQKK (ORCPT ); Mon, 20 Feb 2017 11:10:10 -0500 Received: from mail.kernel.org ([198.145.29.136]:38642 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754027AbdBTQJx (ORCPT ); Mon, 20 Feb 2017 11:09:53 -0500 Date: Mon, 20 Feb 2017 13:09:46 -0300 From: Arnaldo Carvalho de Melo To: Alexander Shishkin Cc: Adrian Hunter , Arnaldo Carvalho de Melo , linux-kernel@vger.kernel.org, vince@deater.net, eranian@google.com, Peter Zijlstra , Ingo Molnar Subject: Re: [PATCH 0/4] perf, pt, coresight: AUX flags and VMX update Message-ID: <20170220160946.GL4109@kernel.org> References: <20170220133352.17995-1-alexander.shishkin@linux.intel.com> <87ino4j3gr.fsf@ashishki-desk.ger.corp.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.7.1 (2016-10-04) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Mon, Feb 20, 2017 at 05:39:43PM +0200, Adrian Hunter escreveu: > On 20/02/17 17:18, Alexander Shishkin wrote: > > Alexander Shishkin writes: > > > >> With the vmm_exclusive=0, PT seems to be much more usable on BDW now. This > >> patchset does three things: > >> * adds a flag to PERF_RECORD_AUX, signalling that a transaction has gaps > >> in it (due to VMX root mode kicking in), > > > > In the above context, will something like this be fine? > Looks fine to me. > Acked-by: Adrian Hunter > > > From: Alexander Shishkin > > Subject: [PATCH] perf tools: Handle partial AUX records and print a warning > > This patch decodes the 'partial' flag in AUX records and prints > > a warning to the user, so that they don't have to guess why their > > PT traces contain gaps (or missing altogether): > >> Warning: > >> AUX data had gaps in it 6 times out of 8! The above should be left for a more verbose mode? > >> Are you running a KVM guest in the background? The warning should be a bit more precise, as you said, tuning vmm_exclusive is key here, i.e.: "Are you running a KVM guest in the background with kvm_intel.vmm_exclusive=1?" And that we can even figure out, its just a matter of reading: [root@jouet ~]# cat /sys/module/kvm_intel/parameters/vmm_exclusive Y I have tested after setting that using: modprobe kvm_intel vmm_exclusive=n And I was able to get Intel PT records from a workload. So perhaps we can get this patch in, which improves the situation, and then, on top of it do these extra checks and give proper hints, ok? - Arnaldo > > Currently this is the only reason for partial records. > > > > Cc: Adrian Hunter > > Signed-off-by: Alexander Shishkin > > --- > > tools/include/uapi/linux/perf_event.h | 1 + > > tools/perf/util/event.c | 5 +++-- > > tools/perf/util/event.h | 1 + > > tools/perf/util/session.c | 17 ++++++++++++++--- > > 4 files changed, 19 insertions(+), 5 deletions(-) > > > > diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h > > index c66a485a24..8306415207 100644 > > --- a/tools/include/uapi/linux/perf_event.h > > +++ b/tools/include/uapi/linux/perf_event.h > > @@ -885,6 +885,7 @@ enum perf_callchain_context { > > */ > > #define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */ > > #define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */ > > +#define PERF_AUX_FLAG_PARTIAL 0x04 /* record contains gaps */ > > > > #define PERF_FLAG_FD_NO_GROUP (1UL << 0) > > #define PERF_FLAG_FD_OUTPUT (1UL << 1) > > diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c > > index 4ea7ce72ed..ba193cd019 100644 > > --- a/tools/perf/util/event.c > > +++ b/tools/perf/util/event.c > > @@ -1153,11 +1153,12 @@ int perf_event__process_exit(struct perf_tool *tool __maybe_unused, > > > > size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp) > > { > > - return fprintf(fp, " offset: %#"PRIx64" size: %#"PRIx64" flags: %#"PRIx64" [%s%s]\n", > > + return fprintf(fp, " offset: %#"PRIx64" size: %#"PRIx64" flags: %#"PRIx64" [%s%s%s]\n", > > event->aux.aux_offset, event->aux.aux_size, > > event->aux.flags, > > event->aux.flags & PERF_AUX_FLAG_TRUNCATED ? "T" : "", > > - event->aux.flags & PERF_AUX_FLAG_OVERWRITE ? "O" : ""); > > + event->aux.flags & PERF_AUX_FLAG_OVERWRITE ? "O" : "", > > + event->aux.flags & PERF_AUX_FLAG_PARTIAL ? "P" : ""); > > } > > > > size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp) > > diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h > > index c735c53a26..d7e53fe176 100644 > > --- a/tools/perf/util/event.h > > +++ b/tools/perf/util/event.h > > @@ -269,6 +269,7 @@ struct events_stats { > > u64 total_lost; > > u64 total_lost_samples; > > u64 total_aux_lost; > > + u64 total_aux_partial; > > u64 total_invalid_chains; > > u32 nr_events[PERF_RECORD_HEADER_MAX]; > > u32 nr_non_filtered_samples; > > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c > > index 4cdbc8f5f1..abdb797fa4 100644 > > --- a/tools/perf/util/session.c > > +++ b/tools/perf/util/session.c > > @@ -1258,9 +1258,12 @@ static int machines__deliver_event(struct machines *machines, > > case PERF_RECORD_UNTHROTTLE: > > return tool->unthrottle(tool, event, sample, machine); > > case PERF_RECORD_AUX: > > - if (tool->aux == perf_event__process_aux && > > - (event->aux.flags & PERF_AUX_FLAG_TRUNCATED)) > > - evlist->stats.total_aux_lost += 1; > > + if (tool->aux == perf_event__process_aux) { > > + if (event->aux.flags & PERF_AUX_FLAG_TRUNCATED) > > + evlist->stats.total_aux_lost += 1; > > + if (event->aux.flags & PERF_AUX_FLAG_PARTIAL) > > + evlist->stats.total_aux_partial += 1; > > + } > > return tool->aux(tool, event, sample, machine); > > case PERF_RECORD_ITRACE_START: > > return tool->itrace_start(tool, event, sample, machine); > > @@ -1548,6 +1551,14 @@ static void perf_session__warn_about_errors(const struct perf_session *session) > > stats->nr_events[PERF_RECORD_AUX]); > > } > > > > + if (session->tool->aux == perf_event__process_aux && > > + stats->total_aux_partial != 0) { > > + ui__warning("AUX data had gaps in it %" PRIu64 " times out of %u!\n\n" > > + "Are you running a KVM guest in the background?\n\n", > > + stats->total_aux_partial, > > + stats->nr_events[PERF_RECORD_AUX]); > > + } > > + > > if (stats->nr_unknown_events != 0) { > > ui__warning("Found %u unknown events!\n\n" > > "Is this an older tool processing a perf.data " > >