diff options
| -rw-r--r-- | arch/x86/kvm/vmx/pmu_intel.c | 9 | 
1 files changed, 4 insertions, 5 deletions
| diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 34a3a17bb6d7..fd21cdb10b79 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -260,13 +260,12 @@ 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))) { -			if (msr_info->host_initiated) -				pmc->counter = data; -			else -				pmc->counter = (s32)data; +			if (!msr_info->host_initiated) +				data = (s64)(s32)data; +			pmc->counter += data - pmc_read_counter(pmc);  			return 0;  		} else if ((pmc = get_fixed_pmc(pmu, msr))) { -			pmc->counter = data; +			pmc->counter += data - pmc_read_counter(pmc);  			return 0;  		} else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {  			if (data == pmc->eventsel) |