From: Yi Sun <yi.y.sun@linux.intel.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: kevin.tian@intel.com, wei.liu2@citrix.com,
he.chen@linux.intel.com, andrew.cooper3@citrix.com,
dario.faggioli@citrix.com, ian.jackson@eu.citrix.com,
mengxu@cis.upenn.edu, xen-devel@lists.xenproject.org,
chao.p.peng@linux.intel.com, roger.pau@citrix.com
Subject: Re: [PATCH v9 10/25] x86: refactor psr: L3 CAT: set value: assemble features value array.
Date: Tue, 28 Mar 2017 11:12:43 +0800 [thread overview]
Message-ID: <20170328031243.GG17458@yi.y.sun> (raw)
In-Reply-To: <58D902D80200007800148076@prv-mh.provo.novell.com>
On 17-03-27 04:17:28, Jan Beulich wrote:
> >>> On 16.03.17 at 12:08, <yi.y.sun@linux.intel.com> 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@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-03-28 3:12 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-16 11:07 [PATCH v9 00/25] Enable L2 Cache Allocation Technology & Refactor psr.c Yi Sun
2017-03-16 11:07 ` [PATCH v9 01/25] docs: create Cache Allocation Technology (CAT) and Code and Data Prioritization (CDP) feature document Yi Sun
2017-03-16 11:07 ` [PATCH v9 02/25] x86: refactor psr: remove L3 CAT/CDP codes Yi Sun
2017-03-16 11:07 ` [PATCH v9 03/25] x86: refactor psr: implement main data structures Yi Sun
2017-03-24 16:19 ` Jan Beulich
2017-03-27 2:38 ` Yi Sun
2017-03-27 6:20 ` Jan Beulich
2017-03-27 7:12 ` Yi Sun
2017-03-27 7:37 ` Jan Beulich
2017-03-16 11:07 ` [PATCH v9 04/25] x86: move cpuid_count_leaf from cpuid.c to processor.h Yi Sun
2017-03-24 16:22 ` Jan Beulich
2017-03-16 11:07 ` [PATCH v9 05/25] x86: refactor psr: L3 CAT: implement CPU init and free flow Yi Sun
2017-03-24 16:52 ` Jan Beulich
2017-03-27 4:41 ` Yi Sun
2017-03-27 6:34 ` Jan Beulich
2017-03-27 8:16 ` Yi Sun
2017-03-27 8:43 ` Jan Beulich
2017-03-16 11:07 ` [PATCH v9 06/25] x86: refactor psr: L3 CAT: implement Domain init/free and schedule flows Yi Sun
2017-03-16 11:07 ` [PATCH v9 07/25] x86: refactor psr: L3 CAT: implement get hw info flow Yi Sun
2017-03-27 9:07 ` Jan Beulich
2017-03-27 12:24 ` Yi Sun
2017-03-27 12:51 ` Jan Beulich
2017-03-27 13:19 ` Yi Sun
2017-03-27 13:32 ` Jan Beulich
2017-03-16 11:07 ` [PATCH v9 08/25] x86: refactor psr: L3 CAT: implement get value flow Yi Sun
2017-03-27 9:23 ` Jan Beulich
2017-03-27 12:59 ` Yi Sun
2017-03-27 13:34 ` Jan Beulich
2017-03-28 2:13 ` Yi Sun
2017-03-28 8:10 ` Jan Beulich
2017-03-16 11:07 ` [PATCH v9 09/25] x86: refactor psr: L3 CAT: set value: implement framework Yi Sun
2017-03-27 9:59 ` Jan Beulich
2017-03-28 1:21 ` Yi Sun
2017-03-28 8:21 ` Jan Beulich
2017-03-16 11:08 ` [PATCH v9 10/25] x86: refactor psr: L3 CAT: set value: assemble features value array Yi Sun
2017-03-27 10:17 ` Jan Beulich
2017-03-28 3:12 ` Yi Sun [this message]
2017-03-28 8:05 ` Yi Sun
2017-03-28 8:36 ` Jan Beulich
2017-03-28 9:11 ` Yi Sun
2017-03-28 9:20 ` Jan Beulich
2017-03-28 10:18 ` Yi Sun
2017-03-28 10:39 ` Jan Beulich
2017-03-28 8:34 ` Jan Beulich
2017-03-28 10:12 ` Yi Sun
2017-03-28 10:36 ` Jan Beulich
2017-03-16 11:08 ` [PATCH v9 11/25] x86: refactor psr: L3 CAT: set value: implement cos finding flow Yi Sun
2017-03-27 10:28 ` Jan Beulich
2017-03-28 3:26 ` Yi Sun
2017-03-28 8:41 ` Jan Beulich
2017-03-16 11:08 ` [PATCH v9 12/25] x86: refactor psr: L3 CAT: set value: implement cos id picking flow Yi Sun
2017-03-27 10:37 ` Jan Beulich
2017-03-28 4:58 ` Yi Sun
2017-03-28 8:45 ` Jan Beulich
2017-03-28 10:31 ` Yi Sun
2017-03-28 10:40 ` Jan Beulich
2017-03-28 11:59 ` Yi Sun
2017-03-28 12:20 ` Jan Beulich
2017-03-29 1:20 ` Yi Sun
2017-03-29 1:36 ` Yi Sun
2017-03-29 9:57 ` Jan Beulich
2017-03-30 1:37 ` Yi Sun
2017-03-30 1:39 ` Yi Sun
2017-03-30 11:55 ` Jan Beulich
2017-03-30 12:10 ` Yi Sun
2017-03-31 8:47 ` Jan Beulich
2017-03-31 9:12 ` Yi Sun
2017-03-31 9:18 ` Yi Sun
2017-03-31 10:19 ` Jan Beulich
2017-03-31 12:40 ` Yi Sun
2017-03-31 12:51 ` Jan Beulich
2017-03-31 13:22 ` Yi Sun
2017-03-31 14:35 ` Jan Beulich
2017-03-31 14:46 ` Yi Sun
2017-03-16 11:08 ` [PATCH v9 13/25] x86: refactor psr: L3 CAT: set value: implement write msr flow Yi Sun
2017-03-27 10:46 ` Jan Beulich
2017-03-28 5:06 ` Yi Sun
2017-03-28 8:48 ` Jan Beulich
2017-03-28 10:20 ` Yi Sun
2017-03-16 11:08 ` [PATCH v9 14/25] x86: refactor psr: CDP: implement CPU init and free flow Yi Sun
2017-03-27 13:58 ` Jan Beulich
2017-03-16 11:08 ` [PATCH v9 15/25] x86: refactor psr: CDP: implement get hw info flow Yi Sun
2017-03-27 14:08 ` Jan Beulich
2017-03-28 5:13 ` Yi Sun
2017-03-16 11:08 ` [PATCH v9 16/25] x86: refactor psr: CDP: implement get value flow Yi Sun
2017-03-16 11:08 ` [PATCH v9 17/25] x86: refactor psr: CDP: implement set value callback functions Yi Sun
2017-03-27 14:17 ` Jan Beulich
2017-03-28 5:14 ` Yi Sun
2017-03-16 11:08 ` [PATCH v9 18/25] x86: L2 CAT: implement CPU init and free flow Yi Sun
2017-03-16 11:08 ` [PATCH v9 19/25] x86: L2 CAT: implement get hw info flow Yi Sun
2017-03-27 14:38 ` Jan Beulich
2017-03-28 5:16 ` Yi Sun
2017-03-16 11:08 ` [PATCH v9 20/25] x86: L2 CAT: implement get value flow Yi Sun
2017-03-27 14:39 ` Jan Beulich
2017-03-16 11:08 ` [PATCH v9 21/25] x86: L2 CAT: implement set " Yi Sun
2017-03-27 14:40 ` Jan Beulich
2017-03-16 11:08 ` [PATCH v9 22/25] tools: L2 CAT: support get HW info for L2 CAT Yi Sun
2017-03-16 11:08 ` [PATCH v9 23/25] tools: L2 CAT: support show cbm " Yi Sun
2017-03-16 11:08 ` [PATCH v9 24/25] tools: L2 CAT: support set " Yi Sun
2017-03-28 14:04 ` Wei Liu
2017-03-29 1:21 ` Yi Sun
2017-03-16 11:08 ` [PATCH v9 25/25] docs: add L2 CAT description in docs Yi Sun
2017-03-16 11:20 ` [PATCH v9 00/25] Enable L2 Cache Allocation Technology & Refactor psr.c Jan Beulich
2017-03-17 1:29 ` Yi Sun
2017-03-17 7:25 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170328031243.GG17458@yi.y.sun \
--to=yi.y.sun@linux.intel.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=chao.p.peng@linux.intel.com \
--cc=dario.faggioli@citrix.com \
--cc=he.chen@linux.intel.com \
--cc=ian.jackson@eu.citrix.com \
--cc=kevin.tian@intel.com \
--cc=mengxu@cis.upenn.edu \
--cc=roger.pau@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.