Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757385AbcLOIm1 (ORCPT ); Thu, 15 Dec 2016 03:42:27 -0500 Received: from merlin.infradead.org ([205.233.59.134]:41876 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751644AbcLOImZ (ORCPT ); Thu, 15 Dec 2016 03:42:25 -0500 Date: Thu, 15 Dec 2016 09:42:13 +0100 From: Peter Zijlstra To: Stephane Eranian Cc: Jiri Olsa , Andi Kleen , LKML , Arnaldo Carvalho de Melo , "mingo@elte.hu" , "Liang, Kan" , Namhyung Kim , Adrian Hunter Subject: Re: [PATCH 2/3] perf/x86/pebs: add workaround for broken OVFL status on HSW Message-ID: <20161215084213.GV3124@twins.programming.kicks-ass.net> References: <20160307202556.GQ6344@twins.programming.kicks-ass.net> <20160308210707.GG6344@twins.programming.kicks-ass.net> <20160310104236.GV6344@twins.programming.kicks-ass.net> <20161214175552.GW3207@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23.1 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2920 Lines: 67 On Wed, Dec 14, 2016 at 11:26:49PM -0800, Stephane Eranian wrote: > On Wed, Dec 14, 2016 at 9:55 AM, Peter Zijlstra wrote: > > > > Just spotted this again, ping? > > > Ok, on what processor running what command, so I can try and reproduce? For me its more of a correctness issue, i've not actually spotted a problem as such. But every time I read this code it makes me wonder. Supposing that the hardware sets the CTRL overflow flags but hasn't generated the PEBS record yet (or not enough records to reach the PEBS buffer threshold) we still don't want to process these events as if they were !PEBS. That is, we _never_ want to look at pebs_enabled, hence unconditional masking of those bits. Hardware _should_ not set them in the first place, but clearly it does sometimes. > >> How about we make the clear of pebs_enabled unconditional? > >> > >> --- > >> arch/x86/events/intel/core.c | 20 ++++++++++---------- > >> 1 file changed, 10 insertions(+), 10 deletions(-) > >> > >> diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c > >> index 68fa55b4d42e..dc9579665425 100644 > >> --- a/arch/x86/events/intel/core.c > >> +++ b/arch/x86/events/intel/core.c > >> @@ -1883,6 +1883,16 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) > >> status &= ~(GLOBAL_STATUS_COND_CHG | > >> GLOBAL_STATUS_ASIF | > >> GLOBAL_STATUS_LBRS_FROZEN); > >> + /* > >> + * There are cases where, even though, the PEBS ovfl bit is set > >> + * in GLOBAL_OVF_STATUS, the PEBS events may also have their > >> + * overflow bits set for their counters. We must clear them > >> + * here because they have been processed as exact samples in > >> + * the drain_pebs() routine. They must not be processed again > >> + * in the for_each_bit_set() loop for regular samples below. > >> + */ > >> + status &= ~cpuc->pebs_enabled; > >> + > >> if (!status) > >> goto done; > >> > >> @@ -1892,16 +1902,6 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) > >> if (__test_and_clear_bit(62, (unsigned long *)&status)) { > >> handled++; > >> x86_pmu.drain_pebs(regs); > >> - /* > >> - * There are cases where, even though, the PEBS ovfl bit is set > >> - * in GLOBAL_OVF_STATUS, the PEBS events may also have their > >> - * overflow bits set for their counters. We must clear them > >> - * here because they have been processed as exact samples in > >> - * the drain_pebs() routine. They must not be processed again > >> - * in the for_each_bit_set() loop for regular samples below. > >> - */ > >> - status &= ~cpuc->pebs_enabled; > >> - status &= x86_pmu.intel_ctrl | GLOBAL_STATUS_TRACE_TOPAPMI; > >> } > >> > >> /*