[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 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. > +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; > @@ -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? > @@ -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. > @@ -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. > + /* > + * 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. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |