[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v19 07/14] x86/VPMU: Initialize PMU for PV(H) guests



>>> On 17.03.15 at 15:54, <boris.ostrovsky@xxxxxxxxxx> wrote:
> @@ -263,14 +264,14 @@ void vpmu_initialise(struct vcpu *v)
>      BUILD_BUG_ON(sizeof(struct xen_pmu_intel_ctxt) > XENPMU_CTXT_PAD_SZ);
>      BUILD_BUG_ON(sizeof(struct xen_pmu_amd_ctxt) > XENPMU_CTXT_PAD_SZ);
>  
> -    if ( is_pvh_vcpu(v) )
> -        return;
> -
>      ASSERT(!vpmu->flags && !vpmu->context);
>  
> -    spin_lock(&vpmu_lock);
> -    vpmu_count++; /* Prevent vpmu_mode from changing until we are done */
> -    spin_unlock(&vpmu_lock);
> +    if ( v->domain != hardware_domain )
> +    {
> +        spin_lock(&vpmu_lock);
> +        vpmu_count++; /* Prevent vpmu_mode from changing until we are done */
> +        spin_unlock(&vpmu_lock);
> +    }

So why is this being made conditional here? A patch this size would
certainly benefit from a slightly more verbose description...

And then if the conditional is indeed needed - why don't you use
is_hardware_domain()?

> +static int pvpmu_init(struct domain *d, xen_pmu_params_t *params)
> +{
> +    struct vcpu *v;
> +    struct vpmu_struct *vpmu;
> +    struct page_info *page;
> +    uint64_t gfn = params->val;
> +
> +    if ( vpmu_mode == XENPMU_MODE_OFF )
> +        return -EINVAL;
> +
> +    if ( (params->vcpu >= d->max_vcpus) || (d->vcpu == NULL) ||
> +         (d->vcpu[params->vcpu] == NULL) )
> +        return -EINVAL;
> +
> +    page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC);
> +    if ( !page )
> +        return -EINVAL;
> +
> +    if ( !get_page_type(page, PGT_writable_page) )
> +    {
> +        put_page(page);
> +        return -EINVAL;
> +    }
> +
> +    v = d->vcpu[params->vcpu];
> +    vpmu = vcpu_vpmu(v);
> +
> +    spin_lock(&vpmu->vpmu_lock);
> +
> +    if ( v->arch.vpmu.xenpmu_data )
> +    {
> +        put_page_and_type(page);
> +        spin_unlock(&vpmu->vpmu_lock);

These two lines should be switched.

> +        return -EEXIST;
> +    }
> +
> +    v->arch.vpmu.xenpmu_data = __map_domain_page_global(page);
> +    if ( !v->arch.vpmu.xenpmu_data )
> +    {
> +        put_page_and_type(page);
> +        spin_unlock(&vpmu->vpmu_lock);

Same here.

> +static void pvpmu_finish(struct domain *d, xen_pmu_params_t *params)
> +{
> +    struct vcpu *v;
> +    struct vpmu_struct *vpmu;
> +    uint64_t mfn;
> +
> +    if ( (params->vcpu >= d->max_vcpus) || (d->vcpu == NULL) ||
> +         (d->vcpu[params->vcpu] == NULL) )
> +        return;
> +
> +    v = d->vcpu[params->vcpu];
> +    if ( v != current )
> +        vcpu_pause(v);
> +
> +    vpmu = vcpu_vpmu(v);
> +    spin_lock(&vpmu->vpmu_lock);
> +
> +    vpmu_destroy(v);
> +
> +    if ( v->arch.vpmu.xenpmu_data )
> +    {
> +        mfn = domain_page_map_to_mfn(v->arch.vpmu.xenpmu_data);
> +        ASSERT(mfn != 0);
> +        unmap_domain_page_global(v->arch.vpmu.xenpmu_data);
> +        put_page_and_type(mfn_to_page(mfn));
> +        v->arch.vpmu.xenpmu_data = NULL;
> +    }
> +
> +    spin_unlock(&vpmu->vpmu_lock);

Similarly here the put should be moved out of the locked region.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.