From nobody Fri Dec 19 02:49:50 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9356F1FBEBE for ; Thu, 13 Mar 2025 06:58:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741849088; cv=none; b=Vk/e7rOJDkQ5fes30tvJctVJQQmD4JvUHvpKJOJYdbFo4zKuhZrkoltSJ04rkFN2SmXlhyrzYxECz0sFltRLXtKcpBEAuMoPGLabNgyoD37Fk1TR/2AHYcvnek6wSNu7Sft+yn6HN+HYY1aMbLlbMktIjF+khWZo+SQ1dzj/N68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741849088; c=relaxed/simple; bh=+7MGOulWYcTlLDw/DCCsYd1DVWMrJUiUcRqYbW+j+3Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FYpkgwxILhQxRSy2QXU1Ll2TzY4ntbQHzQe7kh7Hd3Frhylj65DFq/p6Ob7ncd7M+Qq4cqxmM01ji9NKTMX7P6iFXDM3nLddlYY1qxox5jjL6Gq17PkDiNvbgFiN76r7jdlg1uQnhkJMgDse0J3U/bDnPUZ9t6Nx8anltljMhVc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=Upwg6VC7; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="Upwg6VC7" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2241053582dso15434195ad.1 for ; Wed, 12 Mar 2025 23:58:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1741849086; x=1742453886; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=emEcgI1IcFZcczsFk7v4KbqV5pyU76mkqQgr8+I1+js=; b=Upwg6VC7Fh/SJAGBTCUqxDvGCGaSNMCf0e/zOkmKVH8/u110fHSqL+DFbhhKGZipaG qq5uxE7WPR+v0xkM/pVCKRZBXRz36HlRYQqjMR/eIsMy2K/SgFKed2cw6x6WY3eS3CMu uCLavmFZ0TlrYeEgvIPaIlUXib9qg3+xBKWy5lzP0mU8lWH12N8+lH30/3J3dFEYQGIi dDyCFgA2gsWkCqRCTefMi5uy2F7elEnHO75u4OsQSidF0pef9kW6YJ47Zn55rBijt3Zk XnLPJdUJ29sS90vMtxRrD/CHjqVraphGb6Mzt41XtemwfvvJvr5DrCCaUB3k0CEP+d6U vY4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741849086; x=1742453886; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=emEcgI1IcFZcczsFk7v4KbqV5pyU76mkqQgr8+I1+js=; b=e0wn7vs8iD04TGZlELkgcz8RWEVoVyjLcgwxaO68d+Qq47IduQsBnUVibao+NGcKOq qZJCwhkSIGLCOxgQewd7mXZK8rIwcWHRPqMn9OeErdoN6+T04YVjAijaWlarqWFbk841 myB45ddMsMqSm5aR4e58loYuVvUUVcvUa5nd9xK2OovHXNTQZt/wda7X8YrP2jc1Jx7n 5ci3BWn+w7/1/j+G9lHTS4vD8SzbMg9lS/eSD5+flsp2xUcNjKUUjRiOL1REsF/oFP4e r670FtJBPOCNASuqK5iEe/hXocs1rUBgucT/1vOPLcHB/DvX/UIod+WEoYA/Qk+2Nytj sV8g== X-Forwarded-Encrypted: i=1; AJvYcCUb1Kr/y6GrgVaU67LCycwK6ocJj4t5H4p1f9gN9FiJm0HA9Z+AUK9FtkuuXlDjoHWpWIZCVqpW2jr89zM=@vger.kernel.org X-Gm-Message-State: AOJu0YxiHsV4jW/znKU7/92CSRir9tp9K+qnLdXoJfkzlpzS5OHMdFNF 28Jd5eIPCU50UL8Rq9ktb4paq4tdcKJ7PLvGQ+1PmHqy+YjMifBRTvzt+I5olSI= X-Gm-Gg: ASbGnctPTqhUFu+qiXCQmMuJpN6M/gU0QWcDO0kIHgCrYyyrHxjbxWXX/EU55AhZpUm UHaMWfQCnEXF7LT1qtBRvcgCA6oenoofzILxwH9u/vF7Q3fizdgnIPpRv/ZKoZ+pPGhp1Wd6wFQ XdnA8hL4SAhrlJulhJzrQiZJ9oqv2Fnya2gfncVWlcyrTk85/0QDmyF9iq1WH0vVc/TkxY1wZqF MfIMBP8ArVHOe8DoVersQHTT953MMcXSQWwaPI7+n8b9Ujkb5rzstI3/VZ3s33+n97vDASEoTRA 8eKKaYKcB0U3OyUDIwGNCBDjHpEfNvmHekqz7Tp3HOq2KFQ+ X-Google-Smtp-Source: AGHT+IEBQV8sxGuSmnbE6/nC9EVPLKg/DvEGA12lj+yaW9V3WHmb2Osqgs4iyFBmmenFAgCKYwG/xQ== X-Received: by 2002:a17:902:ce83:b0:21f:c67:a68a with SMTP id d9443c01a7336-22428a890c3mr411961125ad.31.1741849085952; Wed, 12 Mar 2025 23:58:05 -0700 (PDT) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-225c6bd5ae4sm6400565ad.229.2025.03.12.23.58.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 12 Mar 2025 23:58:05 -0700 (PDT) From: Akihiko Odaki Date: Thu, 13 Mar 2025 15:57:43 +0900 Subject: [PATCH v4 2/7] KVM: arm64: PMU: Assume PMU presence in pmu-emul.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250313-pmc-v4-2-2c976827118c@daynix.com> References: <20250313-pmc-v4-0-2c976827118c@daynix.com> In-Reply-To: <20250313-pmc-v4-0-2c976827118c@daynix.com> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Andrew Jones Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, devel@daynix.com, Akihiko Odaki X-Mailer: b4 0.15-dev-edae6 Many functions in pmu-emul.c checks kvm_vcpu_has_pmu(vcpu). A favorable interpretation is defensive programming, but it also has downsides: - It is confusing as it implies these functions are called without PMU although most of them are called only when a PMU is present. - It makes semantics of functions fuzzy. For example, calling kvm_pmu_disable_counter_mask() without PMU may result in no-op as there are no enabled counters, but it's unclear what kvm_pmu_get_counter_value() returns when there is no PMU. - It allows callers without checking kvm_vcpu_has_pmu(vcpu), but it is often wrong to call these functions without PMU. - It is error-prone to duplicate kvm_vcpu_has_pmu(vcpu) checks into multiple functions. Many functions are called for system registers, and the system register infrastructure already employs less error-prone, comprehensive checks. Check kvm_vcpu_has_pmu(vcpu) in callers of these functions instead, and remove the obsolete checks from pmu-emul.c. The only exceptions are the functions that implement ioctls as they have definitive semantics even when the PMU is not present. Signed-off-by: Akihiko Odaki --- arch/arm64/kvm/arm.c | 8 +++++--- arch/arm64/kvm/pmu-emul.c | 25 +------------------------ arch/arm64/kvm/sys_regs.c | 6 ++++-- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index f66ce098f03b..e375468a2217 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -834,9 +834,11 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) if (ret) return ret; =20 - ret =3D kvm_arm_pmu_v3_enable(vcpu); - if (ret) - return ret; + if (kvm_vcpu_has_pmu(vcpu)) { + ret =3D kvm_arm_pmu_v3_enable(vcpu); + if (ret) + return ret; + } =20 if (is_protected_kvm_enabled()) { ret =3D pkvm_create_hyp_vm(kvm); diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c index e3e82b66e226..3dd0b479c6fd 100644 --- a/arch/arm64/kvm/pmu-emul.c +++ b/arch/arm64/kvm/pmu-emul.c @@ -144,9 +144,6 @@ static u64 kvm_pmu_get_pmc_value(struct kvm_pmc *pmc) */ u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx) { - if (!kvm_vcpu_has_pmu(vcpu)) - return 0; - return kvm_pmu_get_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, select_idx)); } =20 @@ -185,9 +182,6 @@ static void kvm_pmu_set_pmc_value(struct kvm_pmc *pmc, = u64 val, bool force) */ void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 = val) { - if (!kvm_vcpu_has_pmu(vcpu)) - return; - kvm_pmu_set_pmc_value(kvm_vcpu_idx_to_pmc(vcpu, select_idx), val, false); } =20 @@ -289,8 +283,6 @@ u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu) void kvm_pmu_enable_counter_mask(struct kvm_vcpu *vcpu, u64 val) { int i; - if (!kvm_vcpu_has_pmu(vcpu)) - return; =20 if (!(kvm_vcpu_read_pmcr(vcpu) & ARMV8_PMU_PMCR_E) || !val) return; @@ -324,7 +316,7 @@ void kvm_pmu_disable_counter_mask(struct kvm_vcpu *vcpu= , u64 val) { int i; =20 - if (!kvm_vcpu_has_pmu(vcpu) || !val) + if (!val) return; =20 for (i =3D 0; i < KVM_ARMV8_PMU_MAX_COUNTERS; i++) { @@ -357,9 +349,6 @@ static void kvm_pmu_update_state(struct kvm_vcpu *vcpu) struct kvm_pmu *pmu =3D &vcpu->arch.pmu; bool overflow; =20 - if (!kvm_vcpu_has_pmu(vcpu)) - return; - overflow =3D !!kvm_pmu_overflow_status(vcpu); if (pmu->irq_level =3D=3D overflow) return; @@ -555,9 +544,6 @@ void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val) { int i; =20 - if (!kvm_vcpu_has_pmu(vcpu)) - return; - /* Fixup PMCR_EL0 to reconcile the PMU version and the LP bit */ if (!kvm_has_feat(vcpu->kvm, ID_AA64DFR0_EL1, PMUVer, V3P5)) val &=3D ~ARMV8_PMU_PMCR_LP; @@ -696,9 +682,6 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vc= pu, u64 data, struct kvm_pmc *pmc =3D kvm_vcpu_idx_to_pmc(vcpu, select_idx); u64 reg; =20 - if (!kvm_vcpu_has_pmu(vcpu)) - return; - reg =3D counter_index_to_evtreg(pmc->idx); __vcpu_sys_reg(vcpu, reg) =3D data & kvm_pmu_evtyper_mask(vcpu->kvm); =20 @@ -804,9 +787,6 @@ u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmce= id1) u64 val, mask =3D 0; int base, i, nr_events; =20 - if (!kvm_vcpu_has_pmu(vcpu)) - return 0; - if (!pmceid1) { val =3D compute_pmceid0(cpu_pmu); base =3D 0; @@ -847,9 +827,6 @@ void kvm_vcpu_reload_pmu(struct kvm_vcpu *vcpu) =20 int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu) { - if (!kvm_vcpu_has_pmu(vcpu)) - return 0; - if (!vcpu->arch.pmu.created) return -EINVAL; =20 diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 0a2ce931a946..6e75557bea1d 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -1784,12 +1784,14 @@ static int set_id_aa64dfr0_el1(struct kvm_vcpu *vcp= u, static u64 read_sanitised_id_dfr0_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd) { - u8 perfmon =3D pmuver_to_perfmon(kvm_arm_pmu_get_pmuver_limit()); + u8 perfmon; u64 val =3D read_sanitised_ftr_reg(SYS_ID_DFR0_EL1); =20 val &=3D ~ID_DFR0_EL1_PerfMon_MASK; - if (kvm_vcpu_has_pmu(vcpu)) + if (kvm_vcpu_has_pmu(vcpu)) { + perfmon =3D pmuver_to_perfmon(kvm_arm_pmu_get_pmuver_limit()); val |=3D SYS_FIELD_PREP(ID_DFR0_EL1, PerfMon, perfmon); + } =20 val =3D ID_REG_LIMIT_FIELD_ENUM(val, ID_DFR0_EL1, CopDbg, Debugv8p8); =20 --=20 2.48.1