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

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



>>> On 16.02.15 at 23:26, <boris.ostrovsky@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -437,6 +437,8 @@ int vcpu_initialise(struct vcpu *v)
>          vmce_init_vcpu(v);
>      }
>  
> +    spin_lock_init(&v->arch.vpmu.vpmu_lock);

This would rather seem to belong into vpmu_initialize().

> @@ -503,6 +509,16 @@ int __init amd_vpmu_init(void)
>          return -EINVAL;
>      }
>  
> +    if ( sizeof(struct xen_pmu_data) +
> +         2 * sizeof(uint64_t) * num_counters > PAGE_SIZE )
> +    {
> +        printk(XENLOG_WARNING
> +               "VPMU: Register bank does not fit into VPMU shared page\n");
> +        counters = ctrls = NULL;
> +        num_counters = 0;
> +        return -ENOSPC;
> +    }

Wouldn't it be more reasonable to simply lower num_counters in
that case?

> +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;
> +
> +    if ( v->arch.vpmu.xenpmu_data )
> +        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);
> +
> +    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);
> +        return -EINVAL;
> +    }
> +
> +    vpmu_initialise(v);
> +
> +    spin_unlock(&vpmu->vpmu_lock);

So what is this lock guarding against here? Certainly not overwriting
of a non-NULL v->arch.vpmu.xenpmu_data (and hence leaking a
page reference)...

> @@ -504,7 +590,7 @@ long do_xenpmu_op(unsigned int op, 
> XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg)
>  
>          if ( copy_to_guest(arg, &pmu_params, 1) )
>              return -EFAULT;
> -        break;
> +         break;

???

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®.