|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 10/25] x86: refactor psr: L3 CAT: set value: assemble features value array.
On 17-03-27 04:17:28, Jan Beulich wrote:
> >>> On 16.03.17 at 12:08, <yi.y.sun@xxxxxxxxxxxxxxx> wrote:
> > --- a/xen/arch/x86/psr.c
> > +++ b/xen/arch/x86/psr.c
> > @@ -101,6 +101,28 @@ struct feat_node {
> > /* get_val is used to get feature COS register value. */
> > void (*get_val)(const struct feat_node *feat, unsigned int cos,
> > enum cbm_type type, uint32_t *val);
> > +
> > + /*
> > + * get_old_val and set_new_val are a pair of functions called in
> > order.
> > + * The caller will traverse all features in the array and call
> > + * 'get_old_val' to get old_cos register value of all supported
> > + * features. Then, call 'set_new_val' to set the new value for the
> > + * designated feature.
> > + *
> > + * All the values are set into value array according to the
> > traversal
> > + * order, meaning the same order of feature array members.
> > + *
> > + * The return value meaning of set_new_val:
> > + * 0 - success.
> > + * negative - error.
> > + */
> > + void (*get_old_val)(uint32_t val[],
> > + const struct feat_node *feat,
> > + unsigned int old_cos);
> > + int (*set_new_val)(uint32_t val[],
> > + const struct feat_node *feat,
> > + enum cbm_type type,
> > + uint32_t new_val);
>
> Along the lines of an earlier comment - are "old" and "new" really
> meaningful here?
>
Maybe 'old' is not accurate. How about 'current'? In fact, we use this
function to get domain's current CBM value. Furthermore, this is to distinguish
'get_val' which is declared above.
I think 'new' is meaningful to express we are setting the newly input value.
How do you think? Thanks!
> > @@ -212,6 +234,29 @@ static enum psr_feat_type
> > psr_cbm_type_to_feat_type(enum cbm_type type)
> > }
> >
> > /* CAT common functions implementation. */
> > +static bool psr_check_cbm(unsigned int cbm_len, uint32_t cbm)
> > +{
> > + unsigned int first_bit, zero_bit;
> > +
> > + /* Set bits should only in the range of [0, cbm_len]. */
> > + if ( cbm & (~0ul << cbm_len) )
>
> Same question as elsewhere about the use of the ul suffix here:
> Can cbm_len really be any value in [0,32]? If not, I don't see
> why the calculation needs to be done as unsigned long. Otoh ...
>
cbm_len is got as below:
#define CAT_CBM_LEN_MASK 0x1f
cat.cbm_len = (regs.a & CAT_CBM_LEN_MASK) + 1;
So its max value is 32.
> > + return false;
> > +
> > + /* At least one bit need to be set. */
> > + if ( cbm == 0 )
> > + return false;
> > +
> > + first_bit = find_first_bit((uint64_t *)&cbm, cbm_len);
> > + zero_bit = find_next_zero_bit((uint64_t *)&cbm, cbm_len, first_bit);
>
> ... these bogus casts suggest that the function would best have
> an "unsigned long" parameter.
>
I would like to modify 'cbm' type to 'uint64_t'. Use a local variable in caller
to do the type conversion.
> > @@ -285,11 +330,35 @@ static void cat_get_val(const struct feat_node *feat,
> > unsigned int cos,
> > *val = feat->cos_reg_val[cos];
> > }
> >
[...]
> > static int gather_val_array(uint32_t val[],
> > @@ -589,7 +672,34 @@ static int gather_val_array(uint32_t val[],
> > const struct psr_socket_info *info,
> > unsigned int old_cos)
> > {
> > - return -EINVAL;
> > + const struct feat_node *feat;
> > + unsigned int i;
> > +
> > + if ( !val )
> > + return -EINVAL;
> > +
> > + /* Get all features current values according to old_cos. */
> > + for ( i = 0; i < PSR_SOCKET_MAX_FEAT; i++ )
> > + {
> > + if ( !info->features[i] )
> > + continue;
> > +
> > + feat = info->features[i];
> > +
> > + if ( old_cos > feat->ops.get_cos_max(feat) )
> > + old_cos = 0;
> > +
> > + /* value getting order is same as feature array */
> > + feat->ops.get_old_val(val, feat, old_cos);
> > +
> > + array_len -= feat->cos_num;
>
> So this I should really have asked about on a much earlier patch,
> but I've recognize the oddity only now: Why is cos_num
> per-feature-node instead of per-feature? This should really be a
> field in struct feat_ops (albeit the name "ops" then will be slightly
> misleading, but I think that's tolerable if you can't think of a better
> name).
>
Ok, I got your meaning. How about 'feat_props'? No matter operations or
variables are all properties of the feature.
> > + if ( array_len < 0 )
> > + return -ENOSPC;
>
> This check needs doing earlier - you need to make sure array_len
> >= ops.cos_num prior to calling ops.get_old_val(). (Doing the
> check after the subtraction even causes wrapping issues, which
> are even more visible in similar code further down.)
>
Thanks for the suggestion! Will move 'array_len >= cos_num' check prior to
call 'get_old_val'.
> > @@ -599,7 +709,43 @@ static int insert_new_val_to_array(uint32_t val[],
> > enum cbm_type type,
> > uint32_t new_val)
> > {
> > - return -EINVAL;
> > + const struct feat_node *feat;
> > + int ret;
> > + unsigned int i;
> > +
> > + ASSERT(feat_type < PSR_SOCKET_MAX_FEAT);
> > +
> > + /* Set new value into array according to feature's position in array.
> > */
> > + for ( i = 0; i < feat_type; i++ )
> > + {
> > + if ( !info->features[i] )
> > + continue;
> > +
> > + feat = info->features[i];
> > +
> > + array_len -= feat->cos_num;
> > + if ( array_len <= 0 )
> > + return -ENOSPC;
> > +
> > + val += feat->cos_num;
> > + }
> > +
> > + feat = info->features[feat_type];
> > +
> > + array_len -= feat->cos_num;
> > + if ( array_len < 0 )
> > + return -ENOSPC;
> > +
> > + /*
> > + * Value setting position is same as feature array.
> > + * Different features may have different setting behaviors, e.g. CDP
> > + * has two values (DATA/CODE) which need us to save input value to
> > + * different position in the array according to type, so we have to
> > + * maintain a callback function.
> > + */
> > + ret = feat->ops.set_new_val(val, feat, type, new_val);
> > +
> > + return ret;
>
> Again a case of a pointless intermediate variable.
>
Will remove it.
> Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |