mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-08 10:36:54 +00:00
KVM: x86/pmu: WARN and bug the VM if PMU is refreshed after vCPU has run
Now that KVM disallows changing feature MSRs, i.e. PERF_CAPABILITIES,
after running a vCPU, WARN and bug the VM if the PMU is refreshed after
the vCPU has run.
Note, KVM has disallowed CPUID updates after running a vCPU since commit
feb627e8d6 ("KVM: x86: Forbid KVM_SET_CPUID{,2} after KVM_RUN"), i.e.
PERF_CAPABILITIES was the only remaining way to trigger a PMU refresh
after KVM_RUN.
Cc: Like Xu <like.xu.linux@gmail.com>
Link: https://lore.kernel.org/r/20230311004618.920745-8-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
0094f62c7e
commit
3a6de51a43
@ -589,6 +589,9 @@ int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||||||
*/
|
*/
|
||||||
void kvm_pmu_refresh(struct kvm_vcpu *vcpu)
|
void kvm_pmu_refresh(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
if (KVM_BUG_ON(kvm_vcpu_has_run(vcpu), vcpu->kvm))
|
||||||
|
return;
|
||||||
|
|
||||||
bitmap_zero(vcpu_to_pmu(vcpu)->all_valid_pmc_idx, X86_PMC_IDX_MAX);
|
bitmap_zero(vcpu_to_pmu(vcpu)->all_valid_pmc_idx, X86_PMC_IDX_MAX);
|
||||||
static_call(kvm_x86_pmu_refresh)(vcpu);
|
static_call(kvm_x86_pmu_refresh)(vcpu);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3632,9 +3632,17 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||||||
if (data & ~kvm_caps.supported_perf_cap)
|
if (data & ~kvm_caps.supported_perf_cap)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note, this is not just a performance optimization! KVM
|
||||||
|
* disallows changing feature MSRs after the vCPU has run; PMU
|
||||||
|
* refresh will bug the VM if called after the vCPU has run.
|
||||||
|
*/
|
||||||
|
if (vcpu->arch.perf_capabilities == data)
|
||||||
|
break;
|
||||||
|
|
||||||
vcpu->arch.perf_capabilities = data;
|
vcpu->arch.perf_capabilities = data;
|
||||||
kvm_pmu_refresh(vcpu);
|
kvm_pmu_refresh(vcpu);
|
||||||
return 0;
|
break;
|
||||||
case MSR_EFER:
|
case MSR_EFER:
|
||||||
return set_efer(vcpu, msr_info);
|
return set_efer(vcpu, msr_info);
|
||||||
case MSR_K7_HWCR:
|
case MSR_K7_HWCR:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user