|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 17/25] x86: refactor psr: CDP: implement set value callback functions.
On 17-04-11 10:03:21, Jan Beulich wrote:
> >>> On 01.04.17 at 15:53, <yi.y.sun@xxxxxxxxxxxxxxx> wrote:
> > @@ -94,6 +102,13 @@ struct feat_node {
> > unsigned int cos_max;
> > unsigned int cbm_len;
> >
> > + /*
> > + * An array to save all 'enum cbm_type' values of the feature. It
> > is
> > + * used with cos_num together to get/write a feature's COS
> > registers
> > + * values one by one.
> > + */
> > + enum cbm_type type[PSR_MAX_COS_NUM];
>
> So here it finally comes. But it's needed the latest in the first CDP
> patch, quite possibly even earlier.
>
Hmm, ok, as the previous patches make you have some confusions. I will move
this to the first CDP patch.
> > +static int compare_val(const uint32_t val[],
> > + const struct feat_node *feat,
> > + unsigned int cos)
> > +{
> > + int rc = 0;
>
> The variable deserves a better name and type bool, according to its
> usage. But I'm unconvinced the variable is needed at all - I think
> without it the intention of the function would be more clear. See
> remarks further down.
>
> > + unsigned int i;
> > +
> > + for ( i = 0; i < feat->props->cos_num; i++ )
> > + {
> > + uint32_t feat_val = 0;
>
> Pointless initializer again.
>
> > + rc = 0;
> > +
> > + /* If cos is bigger than cos_max, we need compare default value. */
> > + if ( cos > feat->props->cos_max )
> > + {
> > + /*
> > + * COS ID 0 always stores the default value so input 0 to get
> > + * default value.
> > + */
> > + feat->props->get_val(feat, 0, feat->props->type[i], &feat_val);
> > +
> > + /*
> > + * If cos is bigger than feature's cos_max, the val should be
> > + * default value. Otherwise, it fails to find a COS ID. So we
> > + * have to exit find flow.
> > + */
> > + if ( val[i] != feat_val )
> > + return -EINVAL;
> > +
> > + rc = 1;
> > + continue;
>
> Drop these two.
>
> > + }
>
> else
> {
>
> > +
> > + /* For CDP, DATA is the first item in val[], CODE is the second. */
> > + feat->props->get_val(feat, cos, feat->props->type[i], &feat_val);
> > + if ( val[i] != feat_val )
> > + break;
>
> return 0;
> }
>
> > +
> > + rc = 1;
>
> Drop.
>
> > + }
> > +
> > + return rc;
>
> return 1;
>
Thanks! My original intention is to avoid the 'else' so that no indentations.
But it seems 'else' is good to you so I will change it to above codes.
> > @@ -851,43 +948,21 @@ static int find_cos(const uint32_t val[], unsigned
> > int array_len,
> > */
> > for ( i = 0; i < PSR_SOCKET_MAX_FEAT; i++ )
> > {
> > - uint32_t default_val = 0;
> > -
> > feat = info->features[i];
> > if ( !feat )
> > continue;
> >
> > /*
> > - * COS ID 0 always stores the default value so input 0 to get
> > - * default value.
> > - */
> > - feat->props->get_val(feat, 0, 0, &default_val);
> > -
> > - /*
> > * Compare value according to feature array order.
> > * We must follow this order because value array is assembled
> > * as this order.
> > */
> > - if ( cos > feat->props->cos_max )
> > - {
> > - /*
> > - * If cos is bigger than feature's cos_max, the val should
> > be
> > - * default value. Otherwise, it fails to find a COS ID. So
> > we
> > - * have to exit find flow.
> > - */
> > - if ( val[0] != default_val )
> > - return -EINVAL;
> > -
> > - found = true;
> > - }
> > - else
> > - {
> > - if ( val[0] == feat->cos_reg_val[cos] )
> > - found = true;
> > - }
> > + rc = compare_val(val, feat, cos);
>
> Why is this being moved into a function here rather than being
> introduced as a function right away?
>
In L3 CAT patch, this part looks simple so I did not encapulate them into a
function. If you prefer a function here, I will do it at the beginning.
> > @@ -922,9 +997,14 @@ static bool fits_cos_max(const uint32_t val[],
> >
> > if ( cos > feat->props->cos_max )
> > {
> > - feat->props->get_val(feat, 0, 0, &default_val);
> > - if ( val[0] != default_val )
> > - return false;
> > + /* For CDP, DATA is the first item in val[], CODE is the
> > second. */
>
> This CDP specific comment doesn't belong into a generic function.
>
Ok, will remove it.
> > @@ -1033,6 +1116,40 @@ static int write_psr_msr(unsigned int socket,
> > unsigned int cos,
> > return 0;
> > }
> >
> > +static void restore_default_val(unsigned int socket, unsigned int cos,
> > + enum psr_feat_type feat_type)
> > +{
> > + unsigned int i, j;
> > + uint32_t default_val;
> > + const struct psr_socket_info *info = get_socket_info(socket);
> > +
> > + for ( i = 0; i < PSR_SOCKET_MAX_FEAT; i++ )
> > + {
> > + const struct feat_node *feat = info->features[i];
>
> Blank line here.
>
Got it.
> > + /*
> > + * There are four judgements:
> > + * 1. Input 'feat_type' is valid so we have to get feature
> > according to
> > + * it. If current feature type (i) does not match 'feat_type',
> > we
> > + * need skip it, so continue to check next feature.
> > + * 2. Input 'feat_type' is 'PSR_SOCKET_MAX_FEAT' which means we
> > should
> > + * handle all features in this case. So, go to next loop.
> > + * 3. Do not need restore the COS value back to default if cos_num
> > is 1,
> > + * e.g. L3 CAT. Because next value setting will overwrite it.
> > + * 4. 'feat' we got is NULL, continue.
> > + */
> > + if ( ( feat_type != PSR_SOCKET_MAX_FEAT && feat_type != i ) ||
>
> Stray blanks inside inner parentheses.
>
Ok, will remove them.
> Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |