[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] x86/mem_sharing: support forks with active vPMU state
On Thu, Jul 21, 2022 at 6:19 AM Jan Beulich <jbeulich@xxxxxxxx> wrote: > > On 20.07.2022 20:47, Tamas K Lengyel wrote: > > --- a/xen/arch/x86/mm/mem_sharing.c > > +++ b/xen/arch/x86/mm/mem_sharing.c > > @@ -1653,6 +1653,46 @@ static void copy_vcpu_nonreg_state(struct vcpu > > *d_vcpu, struct vcpu *cd_vcpu) > > hvm_set_nonreg_state(cd_vcpu, &nrs); > > } > > > > +static int copy_vpmu(struct vcpu *d_vcpu, struct vcpu *cd_vcpu) > > +{ > > + struct vpmu_struct *d_vpmu = vcpu_vpmu(d_vcpu); > > + struct vpmu_struct *cd_vpmu = vcpu_vpmu(cd_vcpu); > > I would hope two of the four pointers could actually be constified. I don't think so, we do modify both the vpmu and vcpu state as-needed on both the parent and the child. > > + if ( !vpmu_are_all_set(d_vpmu, VPMU_INITIALIZED | > > VPMU_CONTEXT_ALLOCATED) ) > > + return 0; > > + if ( vpmu_allocate_context(cd_vcpu) ) > > + return -ENOMEM; > > The function supplies an error code - please use it rather than > assuming it's always going to be -ENOMEM. Alternatively make the > function return bool. (Ideally the hook functions themselves would > be well-formed in this regard, but I realize that the Intel one is > pre-existing in its present undesirable shape.) Sure. > > + /* > > + * The VPMU subsystem only saves the context when the CPU does a > > context > > + * switch. Otherwise, the relevant MSRs are not saved on vmexit. > > + * We force a save here in case the parent CPU context is still loaded. > > + */ > > + if ( vpmu_is_set(d_vpmu, VPMU_CONTEXT_LOADED) ) > > + { > > + int pcpu = smp_processor_id(); > > unsigned int please. > > > + if ( d_vpmu->last_pcpu != pcpu ) > > + { > > + on_selected_cpus(cpumask_of(d_vpmu->last_pcpu), > > + vpmu_save_force, (void *)d_vcpu, 1); > > No need for the cast afaict. > > > + vpmu_reset(d_vpmu, VPMU_CONTEXT_LOADED); > > + } else > > Nit: Style. Sure, these were all pretty much copy-pasted but will fix them. > > + vpmu_save(d_vcpu); > > + } > > + > > + if ( vpmu_is_set(d_vpmu, VPMU_RUNNING) ) > > + vpmu_set(cd_vpmu, VPMU_RUNNING); > > + > > + /* Make sure context gets (re-)loaded when scheduled next */ > > + vpmu_reset(cd_vpmu, VPMU_CONTEXT_LOADED); > > + > > + memcpy(cd_vpmu->context, d_vpmu->context, d_vpmu->context_size); > > + memcpy(cd_vpmu->priv_context, d_vpmu->priv_context, > > d_vpmu->priv_context_size); > > Nit: Long line. Ack. Thanks, Tamas
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |