From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756648AbbKER2M (ORCPT ); Thu, 5 Nov 2015 12:28:12 -0500 Received: from foss.arm.com ([217.140.101.70]:38255 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754336AbbKER2L (ORCPT ); Thu, 5 Nov 2015 12:28:11 -0500 Date: Thu, 5 Nov 2015 17:27:57 +0000 From: Mark Rutland To: "Suzuki K. Poulose" Cc: linux-arm-kernel@lists.infradead.org, punit.agrawal@arm.com, arm@kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCHv2 3/4] arm-cci: Add routines to enable/disable all counters Message-ID: <20151105172756.GH32247@leverpostej> References: <1445346326-30820-1-git-send-email-suzuki.poulose@arm.com> <1445346326-30820-4-git-send-email-suzuki.poulose@arm.com> <20151104182854.GH23860@leverpostej> <563B2C01.80701@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <563B2C01.80701@arm.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > >>+static void pmu_disable_counters_ctrl(struct cci_pmu *cci_pmu, unsigned long *mask) > >>+{ > >>+ int i; > >>+ > >>+ for (i = 0; i < cci_pmu->num_cntrs; i++) { > >>+ clear_bit(i, mask); > >>+ if (pmu_get_counter_ctrl(cci_pmu, i)) { > >>+ set_bit(i, mask); > >>+ pmu_disable_counter(cci_pmu, i); > >>+ } > >>+ } > >>+} > > > >I don't understand what's going on with the mask here. Why do we clear > >ieach bit when the only user (introduced in the next patch) explicitly > >clears the mask anyway? > > To be more precise, it should have been : > > if (pmu_get_counter_ctrl(cci_pmu, i)) { > set_bit(i, mask); > pmu_disable_counter(cci_pmu, i); > } else > clear_bit(i, mask); > > > > >Can we not get rid of the mask entirely? The combination of used_mask > >and each event's hwc->state tells us which counters are actually in use. > > The problem is that neither hwc->state nor the cci_pmu->hw_events->events is > protected by pmu_lock, while enable/disable counter is. So we cannot really > rely on ((struct perf_event *)(cci_pmu->hw_events->events[counter]))->hw->state. They must be protected somehow, or we'd have races against cross-calls and/or the interrupt handler. Are we protected due to being cpu-affine with interrupts disabled when modifying these, is there some other mechanism that protects us, or do we have additional problems here? Thanks, Mark.