* [PATCH v2 0/2] KVM: TDX: Disable PMU virtualization for TDX VMs
@ 2026-05-07 0:36 Vishal Annapurve
2026-05-07 0:36 ` [PATCH v2 1/2] KVM: x86: Introduce arch specific has_protected_pmu state Vishal Annapurve
2026-05-07 0:36 ` [PATCH v2 2/2] KVM: TDX: Set the has_protected_pmu flag for TDX VMs Vishal Annapurve
0 siblings, 2 replies; 5+ messages in thread
From: Vishal Annapurve @ 2026-05-07 0:36 UTC (permalink / raw)
To: seanjc, pbonzini, dave.hansen
Cc: rick.p.edgecombe, dapeng1.mi, mizhang, kai.huang, jmattson, kvm,
linux-kernel, Vishal Annapurve
TDX module virtualizes PMU for TDX VMs [1]. KVM has limited role to play
in virtualizing PMU accesses and needs additional enlightenment to
support all toggles provided by TDX module.
This series disables PMU virtualization within KVM for TDX VMs, which is
a safe bet until the complete set of PMU controls are implemented within KVM.
[1] Section 15.2: https://cdrdv2.intel.com/v1/dl/getContent/733575
Vishal Annapurve (2):
KVM: x86: Introduce arch specific has_protected_pmu state
KVM: TDX: Set the has_protected_pmu flag for TDX VMs
arch/x86/include/asm/kvm_host.h | 1 +
arch/x86/kvm/vmx/tdx.c | 6 ++++++
arch/x86/kvm/x86.c | 8 ++++++--
3 files changed, 13 insertions(+), 2 deletions(-)
--
2.54.0.563.g4f69b47b94-goog
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] KVM: x86: Introduce arch specific has_protected_pmu state
2026-05-07 0:36 [PATCH v2 0/2] KVM: TDX: Disable PMU virtualization for TDX VMs Vishal Annapurve
@ 2026-05-07 0:36 ` Vishal Annapurve
2026-05-07 13:15 ` Sean Christopherson
2026-05-07 0:36 ` [PATCH v2 2/2] KVM: TDX: Set the has_protected_pmu flag for TDX VMs Vishal Annapurve
1 sibling, 1 reply; 5+ messages in thread
From: Vishal Annapurve @ 2026-05-07 0:36 UTC (permalink / raw)
To: seanjc, pbonzini, dave.hansen
Cc: rick.p.edgecombe, dapeng1.mi, mizhang, kai.huang, jmattson, kvm,
linux-kernel, Vishal Annapurve
PMU state for TDX VMs is virtualized by TDX Module [1]. Introduce
has_protected_pmu state to track the pmu state for such scenarios. Disable
KVM's PMU virtualization framework if pmu state is protected as
additional enlightenment is needed within KVM to control/manage the
visibility of PMU state to such VMs.
Additionally disallow userspace VMM to toggle PMU state using
KVM_CAP_PMU_CAPABILITY if pmu state is protected.
[1] Section 15.2: https://cdrdv2.intel.com/v1/dl/getContent/733575
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Vishal Annapurve <vannapurve@google.com>
---
arch/x86/include/asm/kvm_host.h | 1 +
arch/x86/kvm/x86.c | 8 ++++++--
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index c470e40a00aa..8371dcaaed1a 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -1422,6 +1422,7 @@ struct kvm_arch {
bool has_private_mem;
bool has_protected_state;
bool has_protected_eoi;
+ bool has_protected_pmu;
bool pre_fault_allowed;
struct hlist_head *mmu_page_hash;
struct list_head active_mmu_pages;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 0a1b63c63d1a..4836e206f64a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6910,7 +6910,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
break;
mutex_lock(&kvm->lock);
- if (!kvm->created_vcpus && !kvm->arch.created_mediated_pmu) {
+ if (!kvm->created_vcpus && !kvm->arch.created_mediated_pmu &&
+ !kvm->arch.has_protected_pmu) {
kvm->arch.enable_pmu = !(cap->args[0] & KVM_PMU_CAP_DISABLE);
r = 0;
}
@@ -13375,7 +13376,10 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
kvm->arch.default_tsc_khz = max_tsc_khz ? : tsc_khz;
kvm->arch.apic_bus_cycle_ns = APIC_BUS_CYCLE_NS_DEFAULT;
kvm->arch.guest_can_read_msr_platform_info = true;
- kvm->arch.enable_pmu = enable_pmu;
+ if (kvm->arch.has_protected_pmu)
+ kvm->arch.enable_pmu = false;
+ else
+ kvm->arch.enable_pmu = enable_pmu;
#if IS_ENABLED(CONFIG_HYPERV)
spin_lock_init(&kvm->arch.hv_root_tdp_lock);
--
2.54.0.563.g4f69b47b94-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2 1/2] KVM: x86: Introduce arch specific has_protected_pmu state
2026-05-07 0:36 ` [PATCH v2 1/2] KVM: x86: Introduce arch specific has_protected_pmu state Vishal Annapurve
@ 2026-05-07 13:15 ` Sean Christopherson
0 siblings, 0 replies; 5+ messages in thread
From: Sean Christopherson @ 2026-05-07 13:15 UTC (permalink / raw)
To: Vishal Annapurve
Cc: pbonzini, dave.hansen, rick.p.edgecombe, dapeng1.mi, mizhang,
kai.huang, jmattson, kvm, linux-kernel
On Thu, May 07, 2026, Vishal Annapurve wrote:
> PMU state for TDX VMs is virtualized by TDX Module [1]. Introduce
> has_protected_pmu state to track the pmu state for such scenarios. Disable
> KVM's PMU virtualization framework if pmu state is protected as
> additional enlightenment is needed within KVM to control/manage the
> visibility of PMU state to such VMs.
>
> Additionally disallow userspace VMM to toggle PMU state using
> KVM_CAP_PMU_CAPABILITY if pmu state is protected.
>
> [1] Section 15.2: https://cdrdv2.intel.com/v1/dl/getContent/733575
>
> Suggested-by: Sean Christopherson <seanjc@google.com>
> Signed-off-by: Vishal Annapurve <vannapurve@google.com>
> ---
> arch/x86/include/asm/kvm_host.h | 1 +
> arch/x86/kvm/x86.c | 8 ++++++--
> 2 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index c470e40a00aa..8371dcaaed1a 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -1422,6 +1422,7 @@ struct kvm_arch {
> bool has_private_mem;
> bool has_protected_state;
> bool has_protected_eoi;
> + bool has_protected_pmu;
> bool pre_fault_allowed;
> struct hlist_head *mmu_page_hash;
> struct list_head active_mmu_pages;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 0a1b63c63d1a..4836e206f64a 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -6910,7 +6910,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
> break;
>
> mutex_lock(&kvm->lock);
> - if (!kvm->created_vcpus && !kvm->arch.created_mediated_pmu) {
> + if (!kvm->created_vcpus && !kvm->arch.created_mediated_pmu &&
> + !kvm->arch.has_protected_pmu) {
Align.
> kvm->arch.enable_pmu = !(cap->args[0] & KVM_PMU_CAP_DISABLE);
> r = 0;
> }
> @@ -13375,7 +13376,10 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
> kvm->arch.default_tsc_khz = max_tsc_khz ? : tsc_khz;
> kvm->arch.apic_bus_cycle_ns = APIC_BUS_CYCLE_NS_DEFAULT;
> kvm->arch.guest_can_read_msr_platform_info = true;
> - kvm->arch.enable_pmu = enable_pmu;
> + if (kvm->arch.has_protected_pmu)
> + kvm->arch.enable_pmu = false;
> + else
> + kvm->arch.enable_pmu = enable_pmu;
kvm->arch.enable_pmu = enable_pmu && !kvm->arch.has_protected_pmu;
> #if IS_ENABLED(CONFIG_HYPERV)
> spin_lock_init(&kvm->arch.hv_root_tdp_lock);
> --
> 2.54.0.563.g4f69b47b94-goog
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] KVM: TDX: Set the has_protected_pmu flag for TDX VMs
2026-05-07 0:36 [PATCH v2 0/2] KVM: TDX: Disable PMU virtualization for TDX VMs Vishal Annapurve
2026-05-07 0:36 ` [PATCH v2 1/2] KVM: x86: Introduce arch specific has_protected_pmu state Vishal Annapurve
@ 2026-05-07 0:36 ` Vishal Annapurve
2026-05-07 13:23 ` Sean Christopherson
1 sibling, 1 reply; 5+ messages in thread
From: Vishal Annapurve @ 2026-05-07 0:36 UTC (permalink / raw)
To: seanjc, pbonzini, dave.hansen
Cc: rick.p.edgecombe, dapeng1.mi, mizhang, kai.huang, jmattson, kvm,
linux-kernel, Vishal Annapurve
TDX module virtualizes PMU for TDX VMs[1]. Host has following
toggles to control the PMU functionality exposed to TDX VMs:
1) Configure TD_PARAMS to allow guests to use performance monitoring.
2) Restrict the TD to a subset of the PEBS counters if supported.
3) Limit the TD to setup a certain perfmon events using basic/enhanced
event filtering.
KVM will need to be enlightened to support these toggles.
Explicitly set the hast_protected_pmu flag to avoid KVM trying to manage
PMU state for TDX VMs using existing PMU virtualization framework.
[1] Section 15.2: https://cdrdv2.intel.com/v1/dl/getContent/733575
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Vishal Annapurve <vannapurve@google.com>
---
arch/x86/kvm/vmx/tdx.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
index 1e47c194af53..eb4b4518e6f0 100644
--- a/arch/x86/kvm/vmx/tdx.c
+++ b/arch/x86/kvm/vmx/tdx.c
@@ -638,6 +638,12 @@ int tdx_vm_init(struct kvm *kvm)
kvm->arch.has_private_mem = true;
kvm->arch.disabled_quirks |= KVM_X86_QUIRK_IGNORE_GUEST_PAT;
+ /*
+ * PMU support is provided by the TDX-Module (if enabled for the VM).
+ * From KVM's perspective, the VM doesn't have a virtual PMU.
+ */
+ kvm->arch.has_protected_pmu = true;
+
/*
* Because guest TD is protected, VMM can't parse the instruction in TD.
* Instead, guest uses MMIO hypercall. For unmodified device driver,
--
2.54.0.563.g4f69b47b94-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] KVM: TDX: Set the has_protected_pmu flag for TDX VMs
2026-05-07 0:36 ` [PATCH v2 2/2] KVM: TDX: Set the has_protected_pmu flag for TDX VMs Vishal Annapurve
@ 2026-05-07 13:23 ` Sean Christopherson
0 siblings, 0 replies; 5+ messages in thread
From: Sean Christopherson @ 2026-05-07 13:23 UTC (permalink / raw)
To: Vishal Annapurve
Cc: pbonzini, dave.hansen, rick.p.edgecombe, dapeng1.mi, mizhang,
kai.huang, jmattson, kvm, linux-kernel
On Thu, May 07, 2026, Vishal Annapurve wrote:
> TDX module virtualizes PMU for TDX VMs[1]. Host has following
> toggles to control the PMU functionality exposed to TDX VMs:
> 1) Configure TD_PARAMS to allow guests to use performance monitoring.
> 2) Restrict the TD to a subset of the PEBS counters if supported.
> 3) Limit the TD to setup a certain perfmon events using basic/enhanced
> event filtering.
>
> KVM will need to be enlightened to support these toggles.
>
> Explicitly set the hast_protected_pmu flag to avoid KVM trying to manage
> PMU state for TDX VMs using existing PMU virtualization framework.
>
> [1] Section 15.2: https://cdrdv2.intel.com/v1/dl/getContent/733575
>
> Suggested-by: Sean Christopherson <seanjc@google.com>
> Signed-off-by: Vishal Annapurve <vannapurve@google.com>
> ---
> arch/x86/kvm/vmx/tdx.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 1e47c194af53..eb4b4518e6f0 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -638,6 +638,12 @@ int tdx_vm_init(struct kvm *kvm)
> kvm->arch.has_private_mem = true;
> kvm->arch.disabled_quirks |= KVM_X86_QUIRK_IGNORE_GUEST_PAT;
>
> + /*
> + * PMU support is provided by the TDX-Module (if enabled for the VM).
> + * From KVM's perspective, the VM doesn't have a virtual PMU.
> + */
> + kvm->arch.has_protected_pmu = true;
Eh, squash this with patch 1. It's not really possible to review patch 1 without
seeing the usage here.
> +
> /*
> * Because guest TD is protected, VMM can't parse the instruction in TD.
> * Instead, guest uses MMIO hypercall. For unmodified device driver,
> --
> 2.54.0.563.g4f69b47b94-goog
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-05-07 13:23 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-07 0:36 [PATCH v2 0/2] KVM: TDX: Disable PMU virtualization for TDX VMs Vishal Annapurve
2026-05-07 0:36 ` [PATCH v2 1/2] KVM: x86: Introduce arch specific has_protected_pmu state Vishal Annapurve
2026-05-07 13:15 ` Sean Christopherson
2026-05-07 0:36 ` [PATCH v2 2/2] KVM: TDX: Set the has_protected_pmu flag for TDX VMs Vishal Annapurve
2026-05-07 13:23 ` Sean Christopherson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox