Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp3128494imw; Mon, 18 Jul 2022 02:39:35 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vi9PDcUW41uB+WBV9K2pd2v8FU+Oj3btcfxFh+3fsv1jTyrPKRndNu90gkZCu3WgMgr+Ta X-Received: by 2002:a17:906:dc89:b0:72f:1d4f:cea8 with SMTP id cs9-20020a170906dc8900b0072f1d4fcea8mr8587198ejc.654.1658137175727; Mon, 18 Jul 2022 02:39:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658137175; cv=none; d=google.com; s=arc-20160816; b=F1R7eNRDjQohYnl5cTEF83orulbZDqH8VKMVEgpRG/WRhpp8bqcYpxu8LnGOSbMfgU afvVRXZwUcLtt25bVbopNOl3xBTU+N78sqTcuP/1efy3gxWCqQzmjWSDOkVJqz2C3CGy 4QQSdXCvsEH/9FqtWsPsolSYV+14K70aCl1dKCQ4uOyKLMiivnBViopkJ9WIfZVbqL8w QFJ75jOsInftrqC1HcmNuydvnZD0TLK6+spIfGtNJ81K9urm+kUIH3qzqlldEtWat59a H/B5U0UDQPdCZVFKDtyQAfNmkHOsZqYskRxGdqG7ox67ueWYvYL0t+mNENGzRLqsQn3h mNKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=XGPlTi5pGgAGGvej2yBWW/Lg/1I4zBKS94K1xfWKuvs=; b=muBgo5iqg3UjBKUBebmr5kR5rjsz44hDngNcpkLPhnQX5X5Rf9kxQo877zaIArugH2 Vj60NJcoFhCZsSffRw0jxSgDlcvtx3/dKDVtCiGU9C3EmdsBKuc+ns28z/cwQSqI2oA9 GKAX+nempvJQBAWuqADiyfUex6gSB3llM3L7RBIE3vkgrODojeSZtnhfrcYm45i3XufP nHcEryv+VpUQ39mQhnHqHS7AnVqZTB90e5FFE9gLUNePf0iqItyRJ74ZEf+sghAeqbHq 80ff1gQ4tIFGw0a2jr6t5YOag8regAnyecK15eGyzRPL9Foj9k9/hXq2Szb4qef2Msz6 pkOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n21-20020aa7db55000000b0043a72c8b750si14084476edt.114.2022.07.18.02.39.10; Mon, 18 Jul 2022 02:39:35 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233973AbiGRJa3 (ORCPT + 99 others); Mon, 18 Jul 2022 05:30:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54218 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229799AbiGRJa2 (ORCPT ); Mon, 18 Jul 2022 05:30:28 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C5B251A061 for ; Mon, 18 Jul 2022 02:30:26 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DE0D61042; Mon, 18 Jul 2022 02:30:26 -0700 (PDT) Received: from [10.32.33.51] (e121896.warwick.arm.com [10.32.33.51]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 39C443F70D; Mon, 18 Jul 2022 02:30:25 -0700 (PDT) Message-ID: <9b2982f1-023a-3499-7e87-f00b5a689ae9@arm.com> Date: Mon, 18 Jul 2022 10:30:23 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH v3] drivers/perf: arm_spe: Fix consistency of SYS_PMSCR_EL1.CX Content-Language: en-US To: Anshuman Khandual , linux-arm-kernel@lists.infradead.org, Suzuki K Poulose Cc: german.gomez@arm.com, suzuki.poulose@arm.com, Will Deacon , Mark Rutland , Alexey Budankov , linux-kernel@vger.kernel.org References: <20220714061302.2715102-1-anshuman.khandual@arm.com> From: James Clark In-Reply-To: <20220714061302.2715102-1-anshuman.khandual@arm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 14/07/2022 07:13, Anshuman Khandual wrote: > The arm_spe_pmu driver will enable SYS_PMSCR_EL1.CX in order to add CONTEXT > packets into the traces, if the owner of the perf event runs with required > capabilities i.e CAP_PERFMON or CAP_SYS_ADMIN via perfmon_capable() helper. > > The value of this bit is computed in the arm_spe_event_to_pmscr() function > but the check for capabilities happens in the pmu event init callback i.e > arm_spe_pmu_event_init(). This suggests that the value of the CX bit should > remain consistent for the duration of the perf session. > > However, the function arm_spe_event_to_pmscr() may be called later during > the event start callback i.e arm_spe_pmu_start() when the "current" process > is not the owner of the perf session, hence the CX bit setting is currently > not consistent. > > One way to fix this, is by caching the required value of the CX bit during > the initialization of the PMU event, so that it remains consistent for the > duration of the session. It uses currently unused 'event->hw.flags' element > to cache perfmon_capable() value, which can be referred during event start > callback to compute SYS_PMSCR_EL1.CX. This ensures consistent availability > of context packets in the trace as per event owner capabilities. > > Drop BIT(SYS_PMSCR_EL1_CX_SHIFT) check in arm_spe_pmu_event_init(), because > now CX bit cannot be set in arm_spe_event_to_pmscr() with perfmon_capable() > disabled. > > Cc: Will Deacon > Cc: Mark Rutland > Cc: Alexey Budankov > Cc: linux-arm-kernel@lists.infradead.org > Cc: linux-kernel@vger.kernel.org > Fixes: cea7d0d4a59b ("drivers/perf: Open access for CAP_PERFMON privileged process") > Reported-by: German Gomez > Signed-off-by: Anshuman Khandual > --- > Changes in V3: > > - Moved set_spe_event_has_cx() before arm_spe_event_to_pmscr() > - Reinstated perfmon_capable() back in arm_spe_pmu_event_init() > - Dropped BIT(SYS_PMSCR_EL1_CX_SHIFT) check in arm_spe_pmu_event_init() > - Updated the commit message > > Changes in V2: > > https://lore.kernel.org/all/20220713085925.2627533-1-anshuman.khandual@arm.com/ > > - Moved CONFIG_PID_IN_CONTEXTIDR config check inside the helper per Suzuki > - Changed the comment per Suzuki > - Renamed the helpers Per Suzuki > - Added "Fixes: " tag per German > > Changes in V1: > > https://lore.kernel.org/all/20220712051404.2546851-1-anshuman.khandual@arm.com/ > > > drivers/perf/arm_spe_pmu.c | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c > index db670b265897..b65a7d9640e1 100644 > --- a/drivers/perf/arm_spe_pmu.c > +++ b/drivers/perf/arm_spe_pmu.c > @@ -39,6 +39,24 @@ > #include > #include > > +/* > + * Cache if the event is allowed to trace Context information. > + * This allows us to perform the check, i.e, perfmon_capable(), > + * in the context of the event owner, once, during the event_init(). > + */ > +#define SPE_PMU_HW_FLAGS_CX BIT(0) > + > +static void set_spe_event_has_cx(struct perf_event *event) > +{ > + if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && perfmon_capable()) > + event->hw.flags |= SPE_PMU_HW_FLAGS_CX; > +} > + > +static bool get_spe_event_has_cx(struct perf_event *event) > +{ > + return !!(event->hw.flags & SPE_PMU_HW_FLAGS_CX); > +} > + > #define ARM_SPE_BUF_PAD_BYTE 0 > > struct arm_spe_pmu_buf { > @@ -272,7 +290,7 @@ static u64 arm_spe_event_to_pmscr(struct perf_event *event) > if (!attr->exclude_kernel) > reg |= BIT(SYS_PMSCR_EL1_E1SPE_SHIFT); > > - if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && perfmon_capable()) > + if (get_spe_event_has_cx(event)) > reg |= BIT(SYS_PMSCR_EL1_CX_SHIFT); > > return reg; > @@ -709,10 +727,10 @@ static int arm_spe_pmu_event_init(struct perf_event *event) > !(spe_pmu->features & SPE_PMU_FEAT_FILT_LAT)) > return -EOPNOTSUPP; > > + set_spe_event_has_cx(event); > reg = arm_spe_event_to_pmscr(event); > if (!perfmon_capable() && > (reg & (BIT(SYS_PMSCR_EL1_PA_SHIFT) | > - BIT(SYS_PMSCR_EL1_CX_SHIFT) | The first part of the change looks ok, but I'm not sure about this removal here. Doesn't this mean that if you ask for context data when opening the event without permission you don't get an error returned any more? It just silently ignores it. That changes the semantics of the perf event open call and I don't see why that's needed to fix the issue about only checking the permissions of the owning process. At least it seems like a separate unrelated change. It's also worth noting that the value doesn't need to be cached, and another one line solution is just to check the permissions of the owning process. This avoids duplicating something that is already saved, will survive any future refactors of the permissions system, and doesn't use up space in hw_flags: if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && (has_capability(event->owner, CAP_PERFMON) || has_capability(event->owner, CAP_SYS_ADMIN))) { reg |= BIT(SYS_PMSCR_EL1_CX_SHIFT); } > BIT(SYS_PMSCR_EL1_PCT_SHIFT)))) > return -EACCES; >