From patchwork Mon Jan 17 12:44:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: German Gomez X-Patchwork-Id: 12715397 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B150DC433EF for ; Mon, 17 Jan 2022 12:46:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=0+wwbIzjH9nUHNT79LMAgARTvV6t5+azh61Y0pd5O2g=; b=ZxhDM8LLZbZ8QP B/PE8YcBvlCKUOF9ltmyuPxNeGdcjRVN2EarFm1x6/CYFeQm06e3A6Od5ChxHKJ+FjiAqre7wV//G 8Eay6+0oSEKsHJg5xZFOnM/olZU8razPSroLs1sTYSfVqSyep2Ko8k3jeg7JvEfgN2eY41yEQFPiU KurSbDQpAjve3Hfi3zcwWwhPAiI6M3NcQ/MXAwkncf+iPGe9jSnrhGxvfLOorJ/CppB1GcDjQwk2p xOt8UumK+WzX5YRlUtlxL3y30w3JvWG9RRb+WC4XQhVwHQV1bxAhfCdWWyZ+rhqwZMQvnHedVYeLI KMwLj4zWkZKj8JTI3lhw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n9ROI-00EwyA-Q9; Mon, 17 Jan 2022 12:45:42 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n9RO2-00Ews2-IM for linux-arm-kernel@lists.infradead.org; Mon, 17 Jan 2022 12:45:28 +0000 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 5F123101E; Mon, 17 Jan 2022 04:45:25 -0800 (PST) Received: from e127744.arm.com (unknown [10.57.36.133]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 20D453F73D; Mon, 17 Jan 2022 04:45:24 -0800 (PST) From: German Gomez To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, mark.rutland@arm.com, james.clark@arm.com, leo.yan@linaro.org Cc: German Gomez Subject: [RFC PATCH 1/2] perf: arm_spe: Fix consistency of PMSCR register bit CX Date: Mon, 17 Jan 2022 12:44:31 +0000 Message-Id: <20220117124432.3119132-2-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220117124432.3119132-1-german.gomez@arm.com> References: <20220117124432.3119132-1-german.gomez@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220117_044526_740415_082FB9D3 X-CRM114-Status: GOOD ( 16.68 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The arm_spe_pmu driver will enable the CX bit of the PMSCR register in order to add CONTEXT packets into the traces if the owner of the perf event runs with capabilities CAP_PERFMON or CAP_SYS_ADMIN. The value of the bit is computed in the arm_spe_event_to_pmscr function [1], and the check for capabilities happens in [2] in the pmu init callback. 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 start callback [3] when the "current" process is not the owner of the perf session, so the CX bit is currently not consistent. Consider the following example: 1. Run a process in the background with capability CAP_SYS_ADMIN in CPU0. $ taskset --cpu-list 0 sudo dd if=/dev/random of=/dev/null & [3] 3806 2. Begin a perf session _without_ capabilities (we shouldn't see CONTEXT packets). $ perf record -e arm_spe_0// -C0 -- sleep 1 $ perf report -D | grep CONTEXT . 0000000e: 65 df 0e 00 00 CONTEXT 0xedf el2 . 0000004e: 65 df 0e 00 00 CONTEXT 0xedf el2 . 0000008e: 65 df 0e 00 00 CONTEXT 0xedf el2 [...] As can be seen, the traces begin showing CONTEXT packets when the pid is 0xedf (3807). This happens because the pmu start callback is run when the current process is not the owner of the perf session, so the CX register bit is set. One way to fix this is by caching the value of the CX bit during the initialization of the PMU event, so that it remains consistent for the duration of the session. [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/perf/arm_spe_pmu.c?h=v5.16#n275 [2]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/perf/arm_spe_pmu.c?h=v5.16#n713 [3]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/perf/arm_spe_pmu.c?h=v5.16#n751 Signed-off-by: German Gomez --- drivers/perf/arm_spe_pmu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c index d44bcc29d..8515bf85c 100644 --- a/drivers/perf/arm_spe_pmu.c +++ b/drivers/perf/arm_spe_pmu.c @@ -57,6 +57,7 @@ struct arm_spe_pmu { u16 pmsver; u16 min_period; u16 counter_sz; + bool pmscr_cx; #define SPE_PMU_FEAT_FILT_EVT (1UL << 0) #define SPE_PMU_FEAT_FILT_TYP (1UL << 1) @@ -260,6 +261,7 @@ static const struct attribute_group *arm_spe_pmu_attr_groups[] = { static u64 arm_spe_event_to_pmscr(struct perf_event *event) { struct perf_event_attr *attr = &event->attr; + struct arm_spe_pmu *spe_pmu = to_spe_pmu(event->pmu); u64 reg = 0; reg |= ATTR_CFG_GET_FLD(attr, ts_enable) << SYS_PMSCR_EL1_TS_SHIFT; @@ -272,7 +274,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 (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && spe_pmu->pmscr_cx) reg |= BIT(SYS_PMSCR_EL1_CX_SHIFT); return reg; @@ -709,10 +711,10 @@ static int arm_spe_pmu_event_init(struct perf_event *event) !(spe_pmu->features & SPE_PMU_FEAT_FILT_LAT)) return -EOPNOTSUPP; + spe_pmu->pmscr_cx = perfmon_capable(); 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; From patchwork Mon Jan 17 12:44:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: German Gomez X-Patchwork-Id: 12715398 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E179BC433F5 for ; Mon, 17 Jan 2022 12:47:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=7AeU4TLer8zPvhxJ89Piffkt+nb4/hLq89ilLUZ5R8E=; b=D8LeZrW/ECQq57 1O3G2Cq7gKnroJlzPAzawzpq6++YlRxSmiET7YjI1YMqC6PjJtNTT+LZPGuoqaw40bwXaEOEGu8+B braMSzwQ0feNPpxwiSLtF0Eg9GE9LSTXmA3Td+b+jUvJ5octDsXCBMHHfbTsjS4nVOp/GCIEPhPDP rwU985V5LkQWYL5bd6rTcIAaPjsbxWnSfUMOFW7QgY/0ADdUuMvpLM8MVNSqGZFOD95MfUZjI2x9v e4lyVBFcVNd2Dj0QwqpJZJgEUqDhtm/+tQyxgLWC2fXOFPiZwLwrKY0bbOdMsAuNoqOVUPZ24aI2q NDzpsBF2rDnV5unqSXzQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n9ROb-00Ex3V-I9; Mon, 17 Jan 2022 12:46:01 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n9RO5-00Ewtr-CJ for linux-arm-kernel@lists.infradead.org; Mon, 17 Jan 2022 12:45:30 +0000 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 B918C6D; Mon, 17 Jan 2022 04:45:28 -0800 (PST) Received: from e127744.arm.com (unknown [10.57.36.133]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 78EA63F73D; Mon, 17 Jan 2022 04:45:27 -0800 (PST) From: German Gomez To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, mark.rutland@arm.com, james.clark@arm.com, leo.yan@linaro.org Cc: German Gomez Subject: [RFC PATCH 2/2] perf: arm_spe: Enable CONTEXT packets in SPE traces if the profiler runs in CPU mode. Date: Mon, 17 Jan 2022 12:44:32 +0000 Message-Id: <20220117124432.3119132-3-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220117124432.3119132-1-german.gomez@arm.com> References: <20220117124432.3119132-1-german.gomez@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220117_044529_498833_063CE17C X-CRM114-Status: GOOD ( 12.68 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Enable CONTEXT packets in SPE traces if the profiler runs in CPU mode. This is no less permissive than the existing behavior for the following reason: If perf_event_paranoid <= 0, then non perfmon_capable() users can open a per-CPU event. With a per-CPU event, unpriviledged users are allowed to profile _all_ processes, even ones owned by root. Without this change, users could see kernel addresses, root processes, etc, but not gather the PIDs of those processes. The PID is probably the least sensitive of all the information. It would be more idiomatic to check the perf_event_paranoid level with perf_allow_cpu(), but this function is not exported so cannot be used from a module. Looking for cpu != -1 is the indirect way of checking the same thing as it could never get to arm_spe_pmu_event_init() without perf_event_paranoid <= 0. Co-authored-by: James Clark Signed-off-by: German Gomez --- drivers/perf/arm_spe_pmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c index 8515bf85c..7d9a7fa4f 100644 --- a/drivers/perf/arm_spe_pmu.c +++ b/drivers/perf/arm_spe_pmu.c @@ -711,7 +711,7 @@ static int arm_spe_pmu_event_init(struct perf_event *event) !(spe_pmu->features & SPE_PMU_FEAT_FILT_LAT)) return -EOPNOTSUPP; - spe_pmu->pmscr_cx = perfmon_capable(); + spe_pmu->pmscr_cx = perfmon_capable() || (event->cpu != -1); reg = arm_spe_event_to_pmscr(event); if (!perfmon_capable() && (reg & (BIT(SYS_PMSCR_EL1_PA_SHIFT) |