[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 15/19] x86/VPMU: Merge vpmu_rdmsr and vpmu_wrmsr
>>> On 01.07.14 at 16:37, <boris.ostrovsky@xxxxxxxxxx> wrote: > @@ -1794,10 +1794,13 @@ static int svm_msr_write_intercept(unsigned int msr, > uint64_t msr_content) > case MSR_AMD_FAM15H_EVNTSEL3: > case MSR_AMD_FAM15H_EVNTSEL4: > case MSR_AMD_FAM15H_EVNTSEL5: > - if ( vpmu_do_wrmsr(msr, msr_content) ) > + { > + uint64_t msr_val = msr_content; > + > + if ( vpmu_do_msr(msr, &msr_val, VPMU_MSR_WRITE) ) > goto gpf; > break; > - > + } > case MSR_IA32_MCx_MISC(4): /* Threshold register */ Please don't drop blank lines between not falling-through case blocks. > @@ -2240,6 +2240,7 @@ void vmx_vlapic_msr_changed(struct vcpu *v) > static int vmx_msr_write_intercept(unsigned int msr, uint64_t msr_content) > { > struct vcpu *v = current; > + uint64_t msr_val; > > HVM_DBG_LOG(DBG_LEVEL_1, "ecx=%#x, msr_value=%#"PRIx64, msr, > msr_content); > > @@ -2263,7 +2264,8 @@ static int vmx_msr_write_intercept(unsigned int msr, > uint64_t msr_content) > if ( msr_content & ~supported ) > { > /* Perhaps some other bits are supported in vpmu. */ > - if ( vpmu_do_wrmsr(msr, msr_content) ) > + msr_val = msr_content; > + if ( vpmu_do_msr(msr, &msr_val, VPMU_MSR_WRITE) ) What do you need "msr_val" for? I.e. why can't you pass "&msr_content" here? > --- a/xen/arch/x86/hvm/vpmu.c > +++ b/xen/arch/x86/hvm/vpmu.c > @@ -91,7 +91,7 @@ void vpmu_lvtpc_update(uint32_t val) > apic_write(APIC_LVTPC, vpmu->hw_lapic_lvtpc); > } > > -int vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content) > +int vpmu_do_msr(unsigned int msr, uint64_t *msr_content, uint8_t rw) It would seem to me that a plain int (or even better enum) would result in better code than a needlessly fixed-8-bit type. > @@ -99,13 +99,21 @@ int vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content) > if ( !(vpmu_mode & XENPMU_MODE_ON) ) > return 0; > > - if ( vpmu->arch_vpmu_ops && vpmu->arch_vpmu_ops->do_wrmsr ) > + ASSERT((rw == VPMU_MSR_READ) || (rw == VPMU_MSR_WRITE)); > + > + if ( vpmu->arch_vpmu_ops ) > { > - int ret = vpmu->arch_vpmu_ops->do_wrmsr(msr, msr_content); > + int ret; > > + if ( (rw == VPMU_MSR_READ) && vpmu->arch_vpmu_ops->do_rdmsr ) > + ret = vpmu->arch_vpmu_ops->do_rdmsr(msr, msr_content); > + else if ( vpmu->arch_vpmu_ops->do_wrmsr ) > + ret = vpmu->arch_vpmu_ops->do_wrmsr(msr, *msr_content); This won't do what you intend if rw == VPMU_MSR_READ but there's no ->do_rdmsr handler. I also wonder whether latching vpmu->arch_vpmu_ops into a local variable wouldn't benefit readability quite a bit. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |