From patchwork Fri Dec 30 03:59:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Reiji Watanabe X-Patchwork-Id: 13084040 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 EF033C3DA7C for ; Fri, 30 Dec 2022 04:01:25 +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:Cc:To:From:Subject:Message-ID: Mime-Version:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=0jv5aLtcxfkSZjjVujobYqcgBmkavfENVXJExx30pus=; b=Gi2 qGkSvOfyC7YkNXvLcFINKCZlHflNwiVcxLhmM9t9i3SSRldryTDf7M0HIST2YdlqOOdJLfq3tE4jN JNMQIQy0zgsQeRJrw69xEZ7TSjEwfz90nvsQlZkmqQh41UaKMjaj8BeDKAmTyJnS1+6K3ZFcPAonK WgVzhacphy+mMvFv0VZuRJMu8KQWOQ9uMYS8fGjg8jwg2eNC/twIkgVSwYWaiVr3FLydfKrKrd9EL cX33JSyv5SoeXFEiOKLClIWzYpEfRDQdxtC7tMlNoop9bKt3lE+5dtQVECgumy80lNsWKY6OW+kow Fogs/NfHKa9hUBfQSozFjZI09GqDMkw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pB6Yf-005Dh7-Cu; Fri, 30 Dec 2022 03:59:49 +0000 Received: from mail-yw1-x1149.google.com ([2607:f8b0:4864:20::1149]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pB6Ya-005Ddd-U8 for linux-arm-kernel@lists.infradead.org; Fri, 30 Dec 2022 03:59:46 +0000 Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-434eb7c6fa5so220013417b3.14 for ; Thu, 29 Dec 2022 19:59:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=B1xLwV78lCPmkgrGGinUUY3Xt3pN3bRW29JV1F7l2Tw=; b=DnXWG7VxhEDPodtoEqB7yGUoaAkDziJd/CtJ8hDKcKT4+9g0XaRACjdRbHwexe9eSH nfHZOJ4vMHoYfZdbPEoY+kV/xz+zW9WHcd+T334M72Ge5hyBKvMy98o+LZ7xn2TIi+z9 H0Sbg6CC2jFAvRmRDf/XK3YXRDCgG0c6k1/y4C1Zv076kqKD87LN4UqPApqBj8ybRyJ4 hvXHMXi0tTbbskTlCu1YO9OiogFNKnC2vqXp5wjNqKZb4pP8Z/QAmYa2ptkj8NWCqqZr IfU3xmhLcdNJ5kWLCyE3A5KYrm5sXmwYDyu6f2PK1LCyXRoFjUWaknritGGi7KEVJNwc 7PmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=B1xLwV78lCPmkgrGGinUUY3Xt3pN3bRW29JV1F7l2Tw=; b=5XP4Ck31uu8jspSlxdEzamMH90TBJYjtQaX384aN8X3WVNDw8nPP0G/ZV1OHvGKGyG 7dNm3/09D6xa8nswll8raIsdPRhuzlbMx7sSbZDrWldxt8bEKi/Pz24QxZ1Yf5V3Hrae TjX3p7T8qwCM9jeRYPK8oLfYVZJozr1P6pGtOG09Wa1Eya6phC5k8mNWCdr2Qs3rf1Yo Nrm9/z/pj9ooSB008QIW6P/5HrqVXW1TTrfNFQNEHDMoX7AzC7LvQimJetUiG9HNzE5b SNuJQv/hA84hIaYfuGcptKoIwZ98RMbLZ0Gm2vVmTZEPkEsC4ZBktHTxCQ+1kXQ8egTh AZfg== X-Gm-Message-State: AFqh2koTETP5M2XyI/ahibw2xvEZFel1e/YcHU5G7l8a1dXEuCqfPGnF ZoQHquPya0smL6NVRzj7TTESv6UwPzY= X-Google-Smtp-Source: AMrXdXtrSTPSyHUSN0bUEcQslEgn9v/hGErQUCNKveYX1t5cCH2abCenP1S6iHraLmq8WQIDxFx7SB5vYgU= X-Received: from reijiw-west4.c.googlers.com ([fda3:e722:ac3:cc00:20:ed76:c0a8:aa1]) (user=reijiw job=sendgmr) by 2002:a25:8012:0:b0:777:ee99:e98d with SMTP id m18-20020a258012000000b00777ee99e98dmr1661825ybk.597.1672372782523; Thu, 29 Dec 2022 19:59:42 -0800 (PST) Date: Thu, 29 Dec 2022 19:59:21 -0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20221230035928.3423990-1-reijiw@google.com> Subject: [PATCH 0/7] KVM: arm64: PMU: Allow userspace to limit the number of PMCs on vCPU From: Reiji Watanabe To: Marc Zyngier , kvmarm@lists.cs.columbia.edu, kvmarm@lists.linux.dev Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, James Morse , Alexandru Elisei , Suzuki K Poulose , Paolo Bonzini , Ricardo Koller , Oliver Upton , Jing Zhang , Raghavendra Rao Anata , Reiji Watanabe X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221229_195945_012600_AE3C73F4 X-CRM114-Status: GOOD ( 14.90 ) 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 goal of this series is to allow userspace to limit the number of PMU event counters on the vCPU. The number of PMU event counters is indicated in PMCR_EL0.N. For a vCPU with PMUv3 configured, its value will be the same as the host value by default. Userspace can set PMCR_EL0.N for the vCPU to a lower value than the host value, using KVM_SET_ONE_REG. However, it is practically unsupported, as KVM resets PMCR_EL0.N to the host value on vCPU reset and some KVM code uses the host value to identify (un)implemented event counters on the vCPU. This series will ensure that the PMCR_EL0.N value is preserved on vCPU reset and that KVM doesn't use the host value to identify (un)implemented event counters on the vCPU. This allows userspace to limit the number of the PMU event counters on the vCPU. Patch 1 fixes reset_pmu_reg() to ensure that (RAZ) bits of {PMCNTEN,PMOVS}{SET,CLR}_EL1 corresponding to unimplemented event counters on the vCPU are reset to zero even when PMCR_EL0.N for the vCPU is different from the host. Patch 2 is a minor refactoring to use the default PMU register reset function (reset_pmu_reg()) for PMUSERENR_EL0 and PMCCFILTR_EL0. (With the Patch 1 change, reset_pmu_reg() can now be used for those registers) Patch 3 fixes reset_pmcr() to preserve PMCR_EL0.N for the vCPU on vCPU reset. Patch 4-7 adds a selftest to verify reading and writing PMU registers for implemented or unimplemented PMU event counters on the vCPU. The series is based on kvmarm/fixes at the following commit: commit aff234839f8b ("KVM: arm64: PMU: Fix PMCR_EL0 reset value") Reiji Watanabe (7): KVM: arm64: PMU: Have reset_pmu_reg() to clear a register KVM: arm64: PMU: Use reset_pmu_reg() for PMUSERENR_EL0 and PMCCFILTR_EL0 KVM: arm64: PMU: Preserve vCPU's PMCR_EL0.N value on vCPU reset tools: arm64: Import perf_event.h KVM: selftests: aarch64: Introduce vpmu_counter_access test KVM: selftests: aarch64: vPMU register test for implemented counters KVM: selftests: aarch64: vPMU register test for unimplemented counters arch/arm64/kvm/pmu-emul.c | 6 + arch/arm64/kvm/sys_regs.c | 18 +- tools/arch/arm64/include/asm/perf_event.h | 258 ++++++++ tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 1 + .../kvm/aarch64/vpmu_counter_access.c | 613 ++++++++++++++++++ .../selftests/kvm/include/aarch64/processor.h | 1 + 7 files changed, 886 insertions(+), 12 deletions(-) create mode 100644 tools/arch/arm64/include/asm/perf_event.h create mode 100644 tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c base-commit: aff234839f8b80ac101e6c2f14d0e44b236efa48