From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751417AbdGRJO7 (ORCPT ); Tue, 18 Jul 2017 05:14:59 -0400 Received: from merlin.infradead.org ([205.233.59.134]:45270 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751334AbdGRJO6 (ORCPT ); Tue, 18 Jul 2017 05:14:58 -0400 Date: Tue, 18 Jul 2017 11:14:44 +0200 From: Peter Zijlstra To: Jiri Olsa Cc: lkml , Ingo Molnar , Andi Kleen , Alexander Shishkin , Kan Liang Subject: Re: [PATCH] perf/x86/intel: Add proper condition to run sched_task callbacks Message-ID: <20170718091444.afqdtgjijcztv2mn@hirez.programming.kicks-ass.net> References: <20170717150156.11784-1-jolsa@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170717150156.11784-1-jolsa@kernel.org> User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jul 17, 2017 at 05:01:56PM +0200, Jiri Olsa wrote: > The x86 pmu currently uses the sched_task callback for 2 functions: > - PEBS drain > - save/restore LBR data > > They are both triggered once the x86 pmu is registered with > perf_sched_cb_inc call (within pmu::add callback), regardless > if there's actually any PEBS or LBR event configured on the cpu. I don't understand. If we do pmu::add() we _are_ on the CPU. So you're saying intel_pmu_pebs_{add,del}() are doing it wrong? So why not fix those? > diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c > index aa62437d1aa1..1f66356d8122 100644 > --- a/arch/x86/events/intel/core.c > +++ b/arch/x86/events/intel/core.c > @@ -3265,9 +3265,11 @@ static void intel_pmu_cpu_dying(int cpu) > static void intel_pmu_sched_task(struct perf_event_context *ctx, > bool sched_in) > { > - if (x86_pmu.pebs_active) > + struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); > + > + if (intel_pmu_pebs_needs_sched_cb(cpuc)) > intel_pmu_pebs_sched_task(ctx, sched_in); So I'm confused, if we'd not need this, how come we're here in the first place?