[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/3] x86/vPMU: invoke <vendor>_vpmu_initialise() through a hook as well
On 29/11/2021 09:10, Jan Beulich wrote: > I see little point in having an open-coded switch() statement to achieve > the same; like other vendor-specific operations the function can be > supplied in the respective ops structure instances. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Yeah, that logic was just bizarre. Now that the ARM folks have added XEN_DOMCTL_CDF_vpmu, there is a huge quantity of simplification which can be done around vpmu_available()/etc, but that's definitely future work. I think it would probably be good to get a position where we can enable hwdom vpmu by default. There is a spec on how to share perfcounters with firmware, which we ought to investigate to let the watchdog coexists beside vPMU. > --- a/xen/arch/x86/cpu/vpmu.c > +++ b/xen/arch/x86/cpu/vpmu.c > @@ -480,12 +470,17 @@ static int vpmu_arch_initialise(struct v > return -EINVAL; > } > > - vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | APIC_LVT_MASKED; > - > + ret = alternative_call(vpmu_ops.initialise, v); > if ( ret ) > + { > printk(XENLOG_G_WARNING "VPMU: Initialization failed for %pv\n", v); > + return ret; > + } > + > + vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | APIC_LVT_MASKED; > + vpmu_set(vpmu, VPMU_INITIALIZED); It occurs to me that if, in previous patch, you do: if ( ret ) printk(XENLOG_G_WARNING "VPMU: Initialization failed for %pv\n", v); + else + vpmu_set(vpmu, VPMU_INITIALIZED); then you don't need to undo the adjustments in {svm,vmx}_vpmu_initialise() in this patch. > > - return ret; > + return 0; > } > > static void get_vpmu(struct vcpu *v) > --- a/xen/arch/x86/cpu/vpmu_amd.c > +++ b/xen/arch/x86/cpu/vpmu_amd.c > @@ -529,11 +516,22 @@ int svm_vpmu_initialise(struct vcpu *v) > offsetof(struct xen_pmu_amd_ctxt, regs)); > } > > - vpmu_set(vpmu, VPMU_INITIALIZED | VPMU_CONTEXT_ALLOCATED); > + vpmu_set(vpmu, VPMU_CONTEXT_ALLOCATED); > > return 0; > } > > +static const struct arch_vpmu_ops __initconstrel amd_vpmu_ops = { > + .initialise = svm_vpmu_initialise, > + .do_wrmsr = amd_vpmu_do_wrmsr, > + .do_rdmsr = amd_vpmu_do_rdmsr, > + .do_interrupt = amd_vpmu_do_interrupt, > + .arch_vpmu_destroy = amd_vpmu_destroy, > + .arch_vpmu_save = amd_vpmu_save, > + .arch_vpmu_load = amd_vpmu_load, > + .arch_vpmu_dump = amd_vpmu_dump As you're moving everything, trailing comma please. > --- a/xen/arch/x86/cpu/vpmu_intel.c > +++ b/xen/arch/x86/cpu/vpmu_intel.c > @@ -893,11 +880,20 @@ int vmx_vpmu_initialise(struct vcpu *v) > if ( is_pv_vcpu(v) && !core2_vpmu_alloc_resource(v) ) > return -EIO; > > - vpmu_set(vpmu, VPMU_INITIALIZED); > - > return 0; > } > > +static const struct arch_vpmu_ops __initconstrel core2_vpmu_ops = { > + .initialise = vmx_vpmu_initialise, > + .do_wrmsr = core2_vpmu_do_wrmsr, > + .do_rdmsr = core2_vpmu_do_rdmsr, > + .do_interrupt = core2_vpmu_do_interrupt, > + .arch_vpmu_destroy = core2_vpmu_destroy, > + .arch_vpmu_save = core2_vpmu_save, > + .arch_vpmu_load = core2_vpmu_load, > + .arch_vpmu_dump = core2_vpmu_dump And here. Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, although preferably with the VPMU_INITIALIZED adjustment. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |