>>> On 23.06.15 at 09:19, <chao.p.p...@linux.intel.com> wrote: > 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.
Further down in the function you increment found->ref, and it looks suspicious that you return success here having found a slot possibly having refount zero (and thus available for re-use for another CBM). I.e. if this indeed is intended and correct, I think this needs to be explained in a brief comment. >> 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. Ah, makes sense. Jan _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel