From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933036AbdDQIlA (ORCPT ); Mon, 17 Apr 2017 04:41:00 -0400 Received: from terminus.zytor.com ([65.50.211.136]:57927 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932428AbdDQIk6 (ORCPT ); Mon, 17 Apr 2017 04:40:58 -0400 Date: Mon, 17 Apr 2017 01:34:21 -0700 From: tip-bot for Stephane Eranian Message-ID: Cc: mathieu.poirier@linaro.org, jolsa@redhat.com, acme@redhat.com, linux-kernel@vger.kernel.org, pjt@google.com, wangnan0@huawei.com, ak@linux.intel.com, davidcc@google.com, mingo@kernel.org, peterz@infradead.org, tglx@linutronix.de, alexander.shishkin@linux.intel.com, adrian.hunter@intel.com, hpa@zytor.com, eranian@google.com Reply-To: davidcc@google.com, linux-kernel@vger.kernel.org, pjt@google.com, ak@linux.intel.com, wangnan0@huawei.com, jolsa@redhat.com, acme@redhat.com, mathieu.poirier@linaro.org, eranian@google.com, hpa@zytor.com, adrian.hunter@intel.com, tglx@linutronix.de, alexander.shishkin@linux.intel.com, mingo@kernel.org, peterz@infradead.org In-Reply-To: <20170412182301.44406-1-davidcc@google.com> References: <20170412182301.44406-1-davidcc@google.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf stat: Fix bug in handling events in error state Git-Commit-ID: db49a71798a38f3ddf3f3462703328dca39b1ac7 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: db49a71798a38f3ddf3f3462703328dca39b1ac7 Gitweb: http://git.kernel.org/tip/db49a71798a38f3ddf3f3462703328dca39b1ac7 Author: Stephane Eranian AuthorDate: Wed, 12 Apr 2017 11:23:01 -0700 Committer: Arnaldo Carvalho de Melo CommitDate: Thu, 13 Apr 2017 10:40:36 -0300 perf stat: Fix bug in handling events in error state (This is a patch has been sitting in the Intel CQM/CMT driver series for a while, despite not depend on it. Sending it now independently since the series is being discarded.) When an event is in error state, read() returns 0 instead of sizeof() buffer. In certain modes, such as interval printing, ignoring the 0 return value may cause bogus count deltas to be computed and thus invalid results printed. This patch fixes this problem by modifying read_counters() to mark the event as not scaled (scaled = -1) to force the printout routine to show . Signed-off-by: Stephane Eranian Reviewed-by: David Carrillo-Cisneros Acked-by: Jiri Olsa Cc: Adrian Hunter Cc: Alexander Shishkin Cc: Andi Kleen Cc: Mathieu Poirier Cc: Paul Turner Cc: Peter Zijlstra Cc: Wang Nan Link: http://lkml.kernel.org/r/20170412182301.44406-1-davidcc@google.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-stat.c | 12 +++++++++--- tools/perf/util/evsel.c | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 868e086a..610225b 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -312,8 +312,12 @@ static int read_counter(struct perf_evsel *counter) struct perf_counts_values *count; count = perf_counts(counter->counts, cpu, thread); - if (perf_evsel__read(counter, cpu, thread, count)) + if (perf_evsel__read(counter, cpu, thread, count)) { + counter->counts->scaled = -1; + perf_counts(counter->counts, cpu, thread)->ena = 0; + perf_counts(counter->counts, cpu, thread)->run = 0; return -1; + } if (STAT_RECORD) { if (perf_evsel__write_stat_event(counter, cpu, thread, count)) { @@ -338,12 +342,14 @@ static int read_counter(struct perf_evsel *counter) static void read_counters(void) { struct perf_evsel *counter; + int ret; evlist__for_each_entry(evsel_list, counter) { - if (read_counter(counter)) + ret = read_counter(counter); + if (ret) pr_debug("failed to read counter %s\n", counter->name); - if (perf_stat_process_counter(&stat_config, counter)) + if (ret == 0 && perf_stat_process_counter(&stat_config, counter)) pr_warning("failed to process counter %s\n", counter->name); } } diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 8f5d86b..3779b9f 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1239,7 +1239,7 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, if (FD(evsel, cpu, thread) < 0) return -EINVAL; - if (readn(FD(evsel, cpu, thread), count, sizeof(*count)) < 0) + if (readn(FD(evsel, cpu, thread), count, sizeof(*count)) <= 0) return -errno; return 0; @@ -1257,7 +1257,7 @@ int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, if (evsel->counts == NULL && perf_evsel__alloc_counts(evsel, cpu + 1, thread + 1) < 0) return -ENOMEM; - if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) < 0) + if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) <= 0) return -errno; perf_evsel__compute_deltas(evsel, cpu, thread, &count);