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)  		}  		break;  	default: -		if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || -		    (pmc = get_fixed_pmc(pmu, msr))) { -			if (!msr_info->host_initiated) -				data = (s64)(s32)data; -			pmc->counter += data - pmc_read_counter(pmc); +		if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) { +			if (msr_info->host_initiated) +				pmc->counter = data; +			else +				pmc->counter = (s32)data; +			return 0; +		} else if ((pmc = get_fixed_pmc(pmu, msr))) { +			pmc->counter = data;  			return 0;  		} else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {  			if (data == pmc->eventsel)  | 

