On Tue, Jun 16, 2015 at 08:08:34AM +0100, Jan Beulich wrote:
> >>> On 03.06.15 at 06:53, <chao.p.p...@linux.intel.com> wrote:
> > +int psr_set_l3_cbm(struct domain *d, unsigned int socket, uint64_t cbm)
> > +{
> > +    unsigned int old_cos, cos;
> > +    struct psr_cat_cbm *map, *found = NULL;
> > +    struct psr_cat_socket_info *info = NULL;
> > +    int ret = get_cat_socket_info(socket, &info);
> > +
> > +    if ( ret )
> > +        return ret;
> > +
> > +    if ( !psr_check_cbm(info->cbm_len, cbm) )
> > +        return -EINVAL;
> > +
> > +    old_cos = d->arch.psr_cos_ids[socket];
> > +    map = info->cos_to_cbm;
> > +
> > +    spin_lock(&info->cbm_lock);
> > +
> > +    for ( cos = 0; cos <= info->cos_max; cos++ )
> > +    {
> > +        /* If still not found, then keep unused one. */
> > +        if ( !found && cos != 0 && map[cos].ref == 0 )
> > +            found = map + cos;
> > +        else if ( map[cos].cbm == cbm )
> > +        {
> > +            if ( unlikely(cos == old_cos) )
> > +            {
> > +                spin_unlock(&info->cbm_lock);
> > +                return 0;
> 
> Is this in particular, but also the surrounding "else if", correct when
> map[cos].ref == 0? 

I can't see any problem now.

> I can't seem to see map[cos].cbm getting
> invalidated when an entry's refcount drops to zero...

map[cos].cbm is not invalidated when refcount == 0 so that when a same
cbm is requested again I don't need to write the corresponding register.

Chao

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

Reply via email to