[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 12/25] x86: refactor psr: L3 CAT: set value: implement cos id picking flow.
On 17-03-28 04:40:41, Jan Beulich wrote: > >>> On 28.03.17 at 12:31, <yi.y.sun@xxxxxxxxxxxxxxx> wrote: > > On 17-03-28 02:45:13, Jan Beulich wrote: > >> >>> On 28.03.17 at 06:58, <yi.y.sun@xxxxxxxxxxxxxxx> wrote: > >> > On 17-03-27 04:37:37, Jan Beulich wrote: > >> >> >>> On 16.03.17 at 12:08, <yi.y.sun@xxxxxxxxxxxxxxx> wrote: > >> >> > +static bool cat_fits_cos_max(const uint32_t val[], > >> >> > + const struct feat_node *feat, > >> >> > + unsigned int cos) > >> >> > +{ > >> >> > + if ( cos > feat->info.cat_info.cos_max && > >> >> > + val[0] != feat->cos_reg_val[0] ) > >> >> > + /* > >> >> > + * Exceed cos_max and value to set is not default, > >> >> > + * return error. > >> >> > + */ > >> >> > + return false; > >> >> > + > >> >> > + return true; > >> >> > +} > >> >> > >> >> Same here - with cos_max moved out, the hook would seem to > >> >> become unnecessary. > >> >> > >> > As explanation in previous patch, CDP has different behavior. > >> > static bool l3_cdp_fits_cos_max(...) > >> > { > >> > if ( cos > feat->info.cat_info.cos_max && > >> > (val[0] != get_cdp_data(feat, 0) || val[1] != > >> > get_cdp_code(feat, 0)) ) > >> > /* > >> > * Exceed cos_max and value to set is not default, > >> > * return error. > >> > */ > >> > return false; > >> > > >> > return true; > >> > > >> > } > >> > >> As said in reply, by making get_val() flexible enough you should > >> be able to avoid this. > > > > Sorry, I am confused here. 'fits_cos_max' is called during set value > > process. > > Why "making get_val() flexible enough" can avoid this? > > Because that would then replace the get_cdp_data() and > get_cdp_code() calls above. > I think we at least need a 'get_val()' hook. I try to implement CAT/CDP hook. Please help to check if this is what you thought. static void cat_get_val(const struct feat_node *feat, unsigned int cos, enum cbm_type type, int flag, uint32_t *val) { *val = feat->cos_reg_val[cos]; } static void l3_cdp_get_val(const struct feat_node *feat, unsigned int cos, enum cbm_type type, int flag, uint32_t *val) { if ( type == PSR_CBM_TYPE_L3_DATA || flag == 0 ) *val = get_cdp_data(feat, cos); if ( type == PSR_CBM_TYPE_L3_CODE || flag == 1 ) *val = get_cdp_code(feat, cos); } static bool fits_cos_max(const uint32_t val[], uint32_t array_len, const struct psr_socket_info *info, unsigned int cos) { unsigned int i, j; const struct feat_node *feat; uint32_t default_val; for ( i = 0; i < PSR_SOCKET_MAX_FEAT; i++ ) { if ( !info->features[i] ) continue; feat = info->features[i]; if ( array_len < feat->cos_num ) return false; /* Move the fits_cos_max() hook content into caller here. */ if ( cos > feat->props->cos_max ) { for ( j = 0; j < feat->cos_num; j++ ) { /* cos_reg_val[0] always stores the default value so set cos to 0. */ feat->props->get_val(feat, 0, 0, j, &default_val); if ( val[j] != default_val ) return false; } } val += feat->cos_num; } return true; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |