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

Re: [Xen-devel] [PATCH v9 06/13] x86: dynamically get/set CBM for a domain



>>> On 03.06.15 at 06:53, <chao.p.peng@xxxxxxxxxxxxxxx> wrote:
> +static bool_t psr_check_cbm(unsigned int cbm_len, uint64_t cbm)
> +{
> +    unsigned int first_bit, zero_bit;
> +
> +    /* Set bits should only in the range of [0, cbm_len). */
> +    if ( cbm & (~0ull << cbm_len) )
> +        return 0;
> +
> +    /* At least one bit need to be set. */
> +    if ( hweight_long(cbm) < 1 )

Why hweight_long()? Afaict all you need is "cbm != 0".

> +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 seem to see map[cos].cbm getting
invalidated when an entry's refcount drops to zero...

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