Message ID | 20240506053020.3911940-21-mizhang@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Mediated Passthrough vPMU 2.0 for x86 | expand |
On 5/5/2024 10:29 PM, Mingwei Zhang wrote: > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index a5024b7b0439..a18ba5ae5376 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -7860,6 +7860,11 @@ static void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) > vmx->msr_ia32_feature_control_valid_bits &= > ~FEAT_CTL_SGX_LC_ENABLED; > > + if (kvm_pmu_check_rdpmc_passthrough(&vmx->vcpu)) > + exec_controls_clearbit(vmx, CPU_BASED_RDPMC_EXITING); > + else > + exec_controls_setbit(vmx, CPU_BASED_RDPMC_EXITING); > + Seems it's cleaner to put the code inside vmx_set_perf_global_ctrl(), and change the name to reflect that it handles all the PMU related VMCS controls. > /* Refresh #PF interception to account for MAXPHYADDR changes. */ > vmx_update_exception_bitmap(vcpu); > }
On Wed, May 08, 2024, Chen, Zide wrote: > > > On 5/5/2024 10:29 PM, Mingwei Zhang wrote: > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > > index a5024b7b0439..a18ba5ae5376 100644 > > --- a/arch/x86/kvm/vmx/vmx.c > > +++ b/arch/x86/kvm/vmx/vmx.c > > @@ -7860,6 +7860,11 @@ static void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) > > vmx->msr_ia32_feature_control_valid_bits &= > > ~FEAT_CTL_SGX_LC_ENABLED; > > > > + if (kvm_pmu_check_rdpmc_passthrough(&vmx->vcpu)) > > + exec_controls_clearbit(vmx, CPU_BASED_RDPMC_EXITING); > > + else > > + exec_controls_setbit(vmx, CPU_BASED_RDPMC_EXITING); > > + > > Seems it's cleaner to put the code inside vmx_set_perf_global_ctrl(), > and change the name to reflect that it handles all the PMU related VMCS > controls. I prefer putting them separately, but I think I could put the above code into a different helper. Thanks. -Mingwei > > > /* Refresh #PF interception to account for MAXPHYADDR changes. */ > > vmx_update_exception_bitmap(vcpu); > > }
diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c index e656f72fdace..19104e16a986 100644 --- a/arch/x86/kvm/pmu.c +++ b/arch/x86/kvm/pmu.c @@ -96,6 +96,22 @@ void kvm_pmu_ops_update(const struct kvm_pmu_ops *pmu_ops) #undef __KVM_X86_PMU_OP } +bool kvm_pmu_check_rdpmc_passthrough(struct kvm_vcpu *vcpu) +{ + struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); + + if (is_passthrough_pmu_enabled(vcpu) && + !enable_vmware_backdoor && + pmu->nr_arch_gp_counters == kvm_pmu_cap.num_counters_gp && + pmu->nr_arch_fixed_counters == kvm_pmu_cap.num_counters_fixed && + pmu->counter_bitmask[KVM_PMC_GP] == (((u64)1 << kvm_pmu_cap.bit_width_gp) - 1) && + pmu->counter_bitmask[KVM_PMC_FIXED] == (((u64)1 << kvm_pmu_cap.bit_width_fixed) - 1)) + return true; + + return false; +} +EXPORT_SYMBOL_GPL(kvm_pmu_check_rdpmc_passthrough); + static inline void __kvm_perf_overflow(struct kvm_pmc *pmc, bool in_pmi) { struct kvm_pmu *pmu = pmc_to_pmu(pmc); diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h index e041c8a23e2f..91941a0f6e47 100644 --- a/arch/x86/kvm/pmu.h +++ b/arch/x86/kvm/pmu.h @@ -290,6 +290,7 @@ void kvm_pmu_cleanup(struct kvm_vcpu *vcpu); void kvm_pmu_destroy(struct kvm_vcpu *vcpu); int kvm_vm_ioctl_set_pmu_event_filter(struct kvm *kvm, void __user *argp); void kvm_pmu_trigger_event(struct kvm_vcpu *vcpu, u64 eventsel); +bool kvm_pmu_check_rdpmc_passthrough(struct kvm_vcpu *vcpu); bool is_vmware_backdoor_pmc(u32 pmc_idx); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index a5024b7b0439..a18ba5ae5376 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -7860,6 +7860,11 @@ static void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) vmx->msr_ia32_feature_control_valid_bits &= ~FEAT_CTL_SGX_LC_ENABLED; + if (kvm_pmu_check_rdpmc_passthrough(&vmx->vcpu)) + exec_controls_clearbit(vmx, CPU_BASED_RDPMC_EXITING); + else + exec_controls_setbit(vmx, CPU_BASED_RDPMC_EXITING); + /* Refresh #PF interception to account for MAXPHYADDR changes. */ vmx_update_exception_bitmap(vcpu); }