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 v11 07/23] x86: refactor psr: L3 CAT: implement get value flow.
Date: Wed, 31 May 2017 15:30:51 +0800 [thread overview]
Message-ID: <20170531073051.GD3420@yi.y.sun> (raw)
In-Reply-To: <592D982E020000780015DAA9@prv-mh.provo.novell.com>
On 17-05-30 08:05:02, Jan Beulich wrote:
> >>> On 03.05.17 at 10:44, <yi.y.sun@linux.intel.com> wrote:
>
> > --- a/xen/arch/x86/psr.c
> > +++ b/xen/arch/x86/psr.c
> > @@ -476,23 +476,34 @@ static struct psr_socket_info *get_socket_info(unsigned int socket)
> > return socket_info + socket;
> > }
> >
> > +static struct feat_node *psr_get_feat_and_type(unsigned int socket,
> > + enum cbm_type type,
> > + enum psr_feat_type *feat_type)
> > +{
> > + const struct psr_socket_info *info = get_socket_info(socket);
> > +
> > + if ( IS_ERR(info) )
> > + return ERR_PTR(PTR_ERR(info));
> > +
> > + *feat_type = psr_cbm_type_to_feat_type(type);
> > + if ( *feat_type >= ARRAY_SIZE(info->features) )
> > + return NULL;
>
> Note how this return is not being taken care of by ...
>
> > + return info->features[*feat_type];
> > +}
> > +
> > int psr_get_info(unsigned int socket, enum cbm_type type,
> > uint32_t data[], unsigned int array_len)
> > {
> > - const struct psr_socket_info *info = get_socket_info(socket);
> > const struct feat_node *feat;
> > enum psr_feat_type feat_type;
> >
> > ASSERT(data);
> >
> > - if ( IS_ERR(info) )
> > - return PTR_ERR(info);
> > -
> > - feat_type = psr_cbm_type_to_feat_type(type);
> > - if ( feat_type >= ARRAY_SIZE(info->features) )
> > - return -ENOENT;
> > + feat = psr_get_feat_and_type(socket, type, &feat_type);
> > + if ( IS_ERR(feat) )
> > + return PTR_ERR(feat);
>
> ... the check here. I think you want to alter the return above.
>
This NULL is taken care by below code:
if ( !feat || !feat_props[feat_type] )
The returned errors are handled separately. For PTR_ERR, it is handled
above. For NULL, it is handled below.
I checked IS_ERR, I think it can handle the NULL case. The NULL will not
be treated as an error.
> And of course I wonder why you replace code here that was
> only introduced one or two patches earlier. Perhaps that earlier
> patch should do things this way right away?
>
Because the helper function 'psr_get_feat_and_type' is only used by
'psr_get_info' if we implement it in previous patch. This seems
unnecessary. So, I introduce this helper function in this patch.
Shall I move it to previous patch?
> > - feat = info->features[feat_type];
> > if ( !feat || !feat_props[feat_type] )
> > return -ENOENT;
>
> Afaics you need feat_type here only to get at the right feat_props[]
> entry. If that's the case also for future callers of
> psr_get_feat_and_type(), perhaps it would be better for it to
> provide those two instead of the intermediate type? Of course
> that would imply renaming the function. (This change would
> clearly benefit the readability of psr_get_val() below.)
>
Ok, got it.
> > @@ -502,9 +513,38 @@ int psr_get_info(unsigned int socket, enum cbm_type type,
> > return -EINVAL;
> > }
> >
> > -int psr_get_l3_cbm(struct domain *d, unsigned int socket,
> > - uint64_t *cbm, enum cbm_type type)
> > +int psr_get_val(struct domain *d, unsigned int socket,
> > + uint32_t *val, enum cbm_type type)
> > {
> > + const struct feat_node *feat;
> > + enum psr_feat_type feat_type;
> > + unsigned int cos, i;
> > +
> > + ASSERT(val);
> > +
> > + feat = psr_get_feat_and_type(socket, type, &feat_type);
> > + if ( IS_ERR(feat) )
> > + return PTR_ERR(feat);
> > +
> > + if ( !feat || !feat_props[feat_type] )
> > + return -ENOENT;
> > +
> > + cos = d->arch.psr_cos_ids[socket];
> > + /*
> > + * If input cos exceeds current feature's cos_max, we should return its
> > + * default value which is stored in cos 0. This case only happens
> > + * when more than two features enabled concurrently and at least one
> > + * features's cos_max is bigger than others. When a domain's working cos
> > + * id is bigger than some features' cos_max, HW automatically works as
> > + * default value for those features which cos_max is smaller.
> > + */
> > + if ( cos > feat->cos_max )
> > + cos = 0;
> > +
> > + for ( i = 0; i < feat_props[feat_type]->cos_num; i++ )
> > + if ( type == feat_props[feat_type]->type[i] )
> > + *val = feat->cos_reg_val[cos * feat_props[feat_type]->cos_num + i];
> > +
> > return 0;
> > }
>
> Do you really want to return success here even if you didn't write
> to *val? With the way the callers are coded, this is an (at least
> latent) information leak at present.
>
Will fix it. Thanks!
> Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-05-31 7:31 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-03 8:44 [PATCH v11 00/23] Enable L2 Cache Allocation Technology & Refactor psr.c Yi Sun
2017-05-03 8:44 ` [PATCH v11 01/23] docs: create Cache Allocation Technology (CAT) and Code and Data Prioritization (CDP) feature document Yi Sun
2017-05-03 8:44 ` [PATCH v11 02/23] x86: move cpuid_count_leaf from cpuid.c to processor.h Yi Sun
2017-05-03 8:44 ` [PATCH v11 03/23] x86: refactor psr: remove L3 CAT/CDP codes Yi Sun
2017-05-03 8:44 ` [PATCH v11 04/23] x86: refactor psr: L3 CAT: implement main data structures, CPU init and free flows Yi Sun
2017-05-30 13:05 ` Jan Beulich
2017-05-31 2:44 ` Yi Sun
2017-05-31 6:02 ` Jan Beulich
2017-05-31 9:36 ` Jan Beulich
2017-06-01 3:18 ` Yi Sun
2017-06-01 6:57 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 05/23] x86: refactor psr: L3 CAT: implement Domain init/free and schedule flows Yi Sun
2017-05-30 13:26 ` Jan Beulich
2017-05-31 6:37 ` Yi Sun
2017-05-31 6:57 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 06/23] x86: refactor psr: L3 CAT: implement get hw info flow Yi Sun
2017-05-30 13:51 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 07/23] x86: refactor psr: L3 CAT: implement get value flow Yi Sun
2017-05-30 14:05 ` Jan Beulich
2017-05-31 7:30 ` Yi Sun [this message]
2017-05-31 7:45 ` Jan Beulich
2017-05-31 8:05 ` Yi Sun
2017-05-31 8:10 ` Jan Beulich
2017-06-01 3:14 ` Yi Sun
2017-05-03 8:44 ` [PATCH v11 08/23] x86: refactor psr: L3 CAT: set value: implement framework Yi Sun
2017-05-30 14:32 ` Jan Beulich
2017-06-01 10:00 ` Yi Sun
2017-06-01 10:45 ` Jan Beulich
2017-06-02 2:49 ` Yi Sun
2017-06-06 7:43 ` Jan Beulich
2017-06-06 8:18 ` Yi Sun
2017-06-06 8:39 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 09/23] x86: refactor psr: L3 CAT: set value: assemble features value array Yi Sun
2017-05-30 15:17 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 10/23] x86: refactor psr: L3 CAT: set value: implement cos finding flow Yi Sun
2017-05-30 15:23 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 11/23] x86: refactor psr: L3 CAT: set value: implement cos id picking flow Yi Sun
2017-05-03 8:44 ` [PATCH v11 12/23] x86: refactor psr: L3 CAT: set value: implement write msr flow Yi Sun
2017-05-30 15:35 ` Jan Beulich
2017-06-05 8:10 ` Yi Sun
2017-05-03 8:44 ` [PATCH v11 13/23] x86: refactor psr: CDP: implement CPU init flow Yi Sun
2017-05-31 9:37 ` Jan Beulich
2017-06-02 7:26 ` Yi Sun
2017-06-06 7:45 ` Jan Beulich
2017-06-06 8:13 ` Yi Sun
2017-06-06 8:38 ` Jan Beulich
2017-06-07 1:31 ` Yi Sun
2017-06-07 7:28 ` Yi Sun
2017-06-07 8:14 ` Jan Beulich
2017-06-07 9:00 ` Yi Sun
2017-05-03 8:44 ` [PATCH v11 14/23] x86: refactor psr: CDP: implement get hw info flow Yi Sun
2017-05-31 9:40 ` Jan Beulich
2017-06-05 8:09 ` Yi Sun
2017-05-03 8:44 ` [PATCH v11 15/23] x86: refactor psr: CDP: implement set value callback function Yi Sun
2017-05-31 9:44 ` Jan Beulich
2017-06-02 7:59 ` Yi Sun
2017-06-06 7:48 ` Jan Beulich
2017-06-06 8:22 ` Yi Sun
2017-06-06 8:43 ` Jan Beulich
2017-06-06 10:43 ` Yi Sun
2017-06-06 10:49 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 16/23] x86: L2 CAT: implement CPU init flow Yi Sun
2017-05-03 8:44 ` [PATCH v11 17/23] x86: L2 CAT: implement get hw info flow Yi Sun
2017-05-03 8:44 ` [PATCH v11 18/23] x86: L2 CAT: implement get value flow Yi Sun
2017-05-31 9:51 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 19/23] x86: L2 CAT: implement set " Yi Sun
2017-05-31 9:52 ` Jan Beulich
2017-05-03 8:44 ` [PATCH v11 20/23] tools: L2 CAT: support get HW info for L2 CAT Yi Sun
2017-05-11 12:39 ` Wei Liu
2017-05-03 8:44 ` [PATCH v11 21/23] tools: L2 CAT: support show cbm " Yi Sun
2017-05-11 12:40 ` Wei Liu
2017-05-03 8:44 ` [PATCH v11 22/23] tools: L2 CAT: support set " Yi Sun
2017-05-11 12:43 ` Wei Liu
2017-05-03 8:44 ` [PATCH v11 23/23] docs: add L2 CAT description in docs Yi Sun
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=20170531073051.GD3420@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).