diff options
| -rw-r--r-- | arch/x86/kvm/vmx/pmu_intel.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index b6f5157445fe..a99613a060dd 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c | |||
| @@ -240,11 +240,14 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
| 240 | } | 240 | } |
| 241 | break; | 241 | break; |
| 242 | default: | 242 | default: |
| 243 | if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || | 243 | if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) { |
| 244 | (pmc = get_fixed_pmc(pmu, msr))) { | 244 | if (msr_info->host_initiated) |
| 245 | if (!msr_info->host_initiated) | 245 | pmc->counter = data; |
| 246 | data = (s64)(s32)data; | 246 | else |
| 247 | pmc->counter += data - pmc_read_counter(pmc); | 247 | pmc->counter = (s32)data; |
| 248 | return 0; | ||
| 249 | } else if ((pmc = get_fixed_pmc(pmu, msr))) { | ||
| 250 | pmc->counter = data; | ||
| 248 | return 0; | 251 | return 0; |
| 249 | } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { | 252 | } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { |
| 250 | if (data == pmc->eventsel) | 253 | if (data == pmc->eventsel) |
