Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp217421imw; Wed, 13 Jul 2022 23:38:45 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vNALzNlrKLeTT7pQhw3JDT47tRomUHd2HVZQ5Wkiw5QvcC1ORl+khGy8heoHzLou5V8UG4 X-Received: by 2002:a05:6a00:234f:b0:525:1f7c:f2bf with SMTP id j15-20020a056a00234f00b005251f7cf2bfmr7136286pfj.14.1657780725479; Wed, 13 Jul 2022 23:38:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657780725; cv=none; d=google.com; s=arc-20160816; b=mElHD/+VXluYRl1frKXM3L/OKGp/GW89Y5k2tF8QbFvkXcJ9tIq8yxVaUozPm/6Dx8 AYQA/sn7Z2ExCwdTLNsPFuG0zCBgxjtx0lp3h2fdAaULSrjRN3TQ3tSoT7xmd+W9G8vD iDsLnAGykUPLqxp9sWCvYpHlVbiqJihSVANNPUlg8n8mGdHRbJx5i1zkLGdtalVNeboG WKSzSbJUlmfBt4JAabd4wmVU6mK6Y4Gs7LjmR2srbks+0nsU+YniK5Nns6c3WG8+tdNL DqYhp9Bl0t1kNpmB/ziJkgeRw6ylgLxPdy8CdLXhUNP75i9fXvageNYy9l3txNOxjXMO XlOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=6evOgOJWc+N0XrXhLETNzrMPlx03N/RpEUyTTQmkKbw=; b=Acap4AotDzIKVclVVuD5/iD0di4gmGb4GAOqlFPc1WhHJenTexQZIvz4yWUC7OtjSf EA+cjMj9GOkKq86RIUoGEkFM6aApcJiSdMG3s7LXJd9MW5tBZHJ6uEUfawUTXBA1Ld7Z iR8Bz/rs+izjgvG9g5C2HPTKGDlC1xJAWpFQ+KwPrFZXKc2jehFaDiB/Al+BTpx1i6Hg OahwXLkf4QfvNR/G/hWo3WyyDMupqWiTcE0eP7JcF6WmacAKriAWP8JAJrRBjkcJKCBg gRZjZaIt1Q+uc1Tv7svPKHD4sh9gPdMmHDDnFr4vRRH2v9W6jdY19xi4EOv1ZMxpBU9x 7TaA== 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 d16-20020a170903231000b0016c00834db1si1259361plh.14.2022.07.13.23.38.33; Wed, 13 Jul 2022 23:38:45 -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 S233253AbiGNGNf (ORCPT + 99 others); Thu, 14 Jul 2022 02:13:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39412 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233714AbiGNGNV (ORCPT ); Thu, 14 Jul 2022 02:13:21 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 76DB327CCD for ; Wed, 13 Jul 2022 23:13:20 -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 7A92C139F; Wed, 13 Jul 2022 23:13:20 -0700 (PDT) Received: from a077893.blr.arm.com (unknown [10.162.42.10]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 9FB293F792; Wed, 13 Jul 2022 23:13:16 -0700 (PDT) From: Anshuman Khandual To: linux-arm-kernel@lists.infradead.org Cc: german.gomez@arm.com, james.clark@arm.com, suzuki.poulose@arm.com, Anshuman Khandual , Will Deacon , Mark Rutland , Alexey Budankov , linux-kernel@vger.kernel.org Subject: [PATCH v3] drivers/perf: arm_spe: Fix consistency of SYS_PMSCR_EL1.CX Date: Thu, 14 Jul 2022 11:43:02 +0530 Message-Id: <20220714061302.2715102-1-anshuman.khandual@arm.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE 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 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) | BIT(SYS_PMSCR_EL1_PCT_SHIFT)))) return -EACCES; -- 2.25.1