All of lore.kernel.org
 help / color / mirror / Atom feed
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
Subject: Re: [PATCH v8 08/24] x86: refactor psr: set value: implement framework.
Date: Fri, 10 Mar 2017 10:54:22 +0800	[thread overview]
Message-ID: <20170310025422.GF17458@yi.y.sun> (raw)
In-Reply-To: <58C03A3E020000780014155A@prv-mh.provo.novell.com>

On 17-03-08 09:07:10, Jan Beulich wrote:
> >>> On 15.02.17 at 09:49, <yi.y.sun@linux.intel.com> wrote:
> > As set value flow is the most complicated one in psr, it will be
> > divided to some patches to make things clearer. This patch
> > implements the set value framework to show a whole picture firstly.
> > 
> > It also changes domctl interface to make it more general.
> > 
> > To make the set value flow be general and can support multiple features
> > at same time, it includes below steps:
> > 1. Get COS ID of current domain using.
> 
> What is the "using" here supposed to mean?
> 
My meaning is to get the cos id that current domain is using. Sorry for this.
Will make it better.

> > --- a/xen/arch/x86/psr.c
> > +++ b/xen/arch/x86/psr.c
> > @@ -546,18 +546,214 @@ int psr_get_val(struct domain *d, unsigned int socket,
> >      return psr_get(socket, type, NULL, 0, d, val);
> >  }
> >  
> > -int psr_set_l3_cbm(struct domain *d, unsigned int socket,
> > -                   uint64_t cbm, enum cbm_type type)
> > +/* Set value functions */
> > +static unsigned int get_cos_num(const struct psr_socket_info *info)
> >  {
> >      return 0;
> >  }
> >  
> > +static int assemble_val_array(uint64_t *val,
> > +                              uint32_t array_len,
> > +                              const struct psr_socket_info *info,
> > +                              unsigned int old_cos)
> > +{
> > +    return -EINVAL;
> > +}
> > +
> > +static int set_new_val_to_array(uint64_t *val,
> 
> insert_new_val() ? And when talking about arrays, as indicated
> before, please use [] notation instead of pointers. This is
> particularly relevant when the function name suggests that it
> would be "val" which gets inserted, but aiui it is really ...
> 
> > +                                uint32_t array_len,
> > +                                const struct psr_socket_info *info,
> > +                                enum psr_feat_type feat_type,
> > +                                enum cbm_type type,
> > +                                uint64_t m)
> 
> ... "m". Therefore please also consider better naming of parameters.
> 
Sure, thanks!

> > +static int write_psr_msr(unsigned int socket, unsigned int cos,
> > +                         const uint64_t *val)
> > +{
> > +    return -ENOENT;
> > +}
> 
> Is this function intended you write just one MSR, or potentially many?
> In the latter case the name would perhaps better be "write_psr_msrs()".
> 
For one feature, it does set one MSR.

> > +int psr_set_val(struct domain *d, unsigned int socket,
> > +                uint64_t val, enum cbm_type type)
> > +{
> > +    unsigned int old_cos;
> > +    int cos, ret;
> > +    unsigned int *ref;
> > +    uint64_t *val_array;
> > +    struct psr_socket_info *info = get_socket_info(socket);
> > +    uint32_t array_len;
> > +    enum psr_feat_type feat_type;
> > +
> > +    if ( IS_ERR(info) )
> > +        return PTR_ERR(info);
> > +
> > +    feat_type = psr_cbm_type_to_feat_type(type);
> > +    if ( !test_bit(feat_type, &info->feat_mask) )
> > +        return -ENOENT;
> > +
> > +    /*
> > +     * Step 0:
> > +     * old_cos means the COS ID current domain is using. By default, it is 0.
> > +     *
> > +     * For every COS ID, there is a reference count to record how many domains
> > +     * are using the COS register corresponding to this COS ID.
> > +     * - If ref[old_cos] is 0, that means this COS is not used by any domain.
> > +     * - If ref[old_cos] is 1, that means this COS is only used by current
> > +     *   domain.
> > +     * - If ref[old_cos] is more than 1, that mean multiple domains are using
> > +     *   this COS.
> > +     */
> > +    old_cos = d->arch.psr_cos_ids[socket];
> > +    if ( old_cos > MAX_COS_REG_CNT )
> > +        return -EOVERFLOW;
> 
> Doesn't this need to be >= ? And isn't this happening an indication
> of a bug, i.e. shouldn't there be an ASSERT_UNREACHABLE() ahead
> of the return?
> 
Sorry. This has been corrected in next version. Thanks!

> > +    ref = info->cos_ref;
> > +
> > +    /*
> > +     * Step 1:
> > +     * Assemle a value array to store all featues cos_reg_val[old_cos].
> 
> Assemble ... features ...
> 
Oh, sorry.

[...]
> > +    /*
> > +     * Step 2:
> > +     * Try to find if there is already a COS ID on which all features' values
> > +     * are same as the array. Then, we can reuse this COS ID.
> > +     */
> > +    cos = find_cos(val_array, array_len, feat_type, info);
> > +    if ( cos >= 0 )
> > +    {
> > +        if ( cos == old_cos )
> > +        {
> > +            spin_unlock(&info->ref_lock);
> > +            xfree(val_array);
> > +            return 0;
> > +        }
> 
> You could save a level of indentation if you inverted the outer if()'s
> condition and made the code above "else if".
> 
Will consider it.

> > +    }
> > +    else
> > +    {
> > +        /*
> > +         * Step 3:
> > +         * If fail to find, we need allocate a new COS ID.
> > +         * If multiple domains are using same COS ID, its ref is more
> > +         * than 1. That means we cannot free this COS to make current domain
> > +         * use it. Because other domains are using the value saved in the COS.
> > +         * Unless the ref is changed to 1 (mean only current domain is using
> > +         * it), we cannot allocate the COS ID to current domain.
> 
> I think I had been confused by this already before, and I continue to
> be: How could ref be "changed to 1" here, and then have said
> meaning? If you refer to the value after a possible decrement, the
> value then being 1 means there is another domain using it. Hence ...
> 
> > +         * So, only the COS ID which ref is 1 or 0 can be allocated.
> 
> ... I think this is not generally correct either: A COS with ref 1 can
> only be re-used it that's old_cos. In all other cases only ref 0 ones
> are candidates. But anyway I think the comment belongs into the
> function, which would then allow for seeing it be added along with
> the actual code, making it possible to check that both match up.
> 
Sorry, the expression is not good. In fact, only COS ID which ref is 1 or 0
can be allocated to current domain. If old_cos is not 0 and its ref==1 means
that only current domain is using this old_cos ID. So, this old_cos ID is
certainly can be reused by current domain. Ref==0 means there is no any domain
using this COS ID. So it can be used too.

I will polish the comments.

> > +         */
> > +        cos = pick_avail_cos(info, val_array, array_len, old_cos, feat_type);
> > +        if ( cos < 0 )
> > +        {
> > +            spin_unlock(&info->ref_lock);
> > +            xfree(val_array);
> > +            return cos;
> > +        }
> > +
> > +        /*
> > +         * Step 4:
> > +         * Write all features MSRs according to the COS ID.
> > +         */
> > +        ret = write_psr_msr(socket, cos, val_array);
> > +        if ( ret )
> > +        {
> > +            spin_unlock(&info->ref_lock);
> > +            xfree(val_array);
> > +            return ret;
> > +        }
> 
> These recurring error paths could certainly do with folding.
> 
Yes, Wei has suggested to use goto to handle them. This has been refined in
next version.

> > +    }
> > +
> > +    /*
> > +     * Step 5:
> > +     * Update ref according to COS ID.
> > +     */
> > +    ref[cos]++;
> > +    ASSERT(ref[cos] || cos == 0);
> 
>     ASSERT(!cos || ref[cos]);
>     ASSERT(!old_cos || ref[old_cos]);
> 
Ok, thanks!

> > +    ref[old_cos]--;
> > +    spin_unlock(&info->ref_lock);
> > +
> > +    /*
> > +     * Step 6:
> > +     * Save the COS ID into current domain's psr_cos_ids[] so that we can know
> > +     * which COS the domain is using on the socket. One domain can only use
> > +     * one COS ID at same time on each socket.
> > +     */
> > +    d->arch.psr_cos_ids[socket] = cos;
> 
> So the domain has not been paused, i.e. some of its vCPU-s may
> be running on other pCPU-s (including ones on the socket in
> question). How come it is safe to update this value here?
> 
This is a domctl operation. It is protected by domctl_lock which is locked in
do_domctl().

> >  /* Called with domain lock held, no extra lock needed for 'psr_cos_ids' */
> >  static void psr_free_cos(struct domain *d)
> >  {
> > -    if( !d->arch.psr_cos_ids )
> > +    unsigned int socket, cos;
> > +
> > +    if ( !d->arch.psr_cos_ids )
> >          return;
> 
> As in an earlier patch I've asked for this check to be removed, I
> think you will need to add a check on socket_info to be non-
> NULL somewhere in this function.
> 
Ok, will do it in the loop.

> > +    /* Domain is free so its cos_ref should be decreased. */
> 
> "Domain is free" ? DYM "is being destroyed"?
> 
Yes. 

> > +    for ( socket = 0; socket < nr_sockets; socket++ )
> > +    {
> > +        struct psr_socket_info *info;
> > +
> > +        /* cos 0 is default one which does not need be handled. */
> > +        if ( (cos = d->arch.psr_cos_ids[socket]) == 0 )
> > +            continue;
> > +
> > +        /*
> > +         * If domain uses other cos ids, all corresponding refs must have been
> > +         * increased 1 for this domain. So, we need decrease them.
> > +         */
> > +        info = socket_info + socket;
> > +        ASSERT(info->cos_ref[cos] || cos == 0);
> > +        spin_lock(&info->ref_lock);
> > +        info->cos_ref[cos]--;
> > +        spin_unlock(&info->ref_lock);
> 
> The ASSERT() is useful only inside the locked region.
> 
Ok, thanks!

> Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2017-03-10  2:54 UTC|newest]

Thread overview: 122+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-15  8:49 [PATCH v8 00/24] Enable L2 Cache Allocation Technology & Refactor psr.c Yi Sun
2017-02-15  8:49 ` [PATCH v8 01/24] docs: create Cache Allocation Technology (CAT) and Code and Data Prioritization (CDP) feature document Yi Sun
2017-02-15 16:49   ` Konrad Rzeszutek Wilk
2017-02-26 17:40   ` Wei Liu
2017-02-15  8:49 ` [PATCH v8 02/24] x86: refactor psr: remove L3 CAT/CDP codes Yi Sun
2017-02-26 17:40   ` Wei Liu
2017-02-15  8:49 ` [PATCH v8 03/24] x86: refactor psr: implement main data structures Yi Sun
2017-02-28 11:58   ` Roger Pau Monné
2017-03-01  5:10     ` Yi Sun
2017-03-01  8:17       ` Jan Beulich
2017-03-01  8:28         ` Yi Sun
2017-03-01  8:39           ` Jan Beulich
2017-03-01  8:49       ` Roger Pau Monn�
2017-03-01  8:54         ` Jan Beulich
2017-03-01  9:00           ` Roger Pau Monn�
2017-02-15  8:49 ` [PATCH v8 04/24] x86: refactor psr: implement CPU init and free flow Yi Sun
2017-02-26 17:41   ` Wei Liu
2017-02-27  6:42     ` Yi Sun
2017-02-27 11:45       ` Wei Liu
2017-02-27  8:41     ` Jan Beulich
2017-03-08 14:56   ` Jan Beulich
2017-03-10  1:32     ` Yi Sun
2017-03-10  8:56       ` Jan Beulich
2017-03-13  2:18         ` Yi Sun
2017-02-15  8:49 ` [PATCH v8 05/24] x86: refactor psr: implement Domain init/free and schedule flows Yi Sun
2017-02-26 17:41   ` Wei Liu
2017-03-08 15:04   ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 06/24] x86: refactor psr: implement get hw info flow Yi Sun
2017-02-26 17:41   ` Wei Liu
2017-02-28 12:34   ` Roger Pau Monné
2017-03-08 15:15   ` Jan Beulich
2017-03-10  1:43     ` Yi Sun
2017-03-10  8:57       ` Jan Beulich
2017-03-10  9:01         ` Yi Sun
2017-02-15  8:49 ` [PATCH v8 07/24] x86: refactor psr: implement get value flow Yi Sun
2017-02-28 12:44   ` Roger Pau Monné
2017-03-01  5:21     ` Yi Sun
2017-03-08 15:35   ` Jan Beulich
2017-03-10  1:50     ` Yi Sun
2017-03-10  9:05       ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 08/24] x86: refactor psr: set value: implement framework Yi Sun
2017-02-26 17:41   ` Wei Liu
2017-02-27  7:06     ` Yi Sun
2017-02-27 10:55       ` Jan Beulich
2017-02-28 13:58   ` Roger Pau Monné
2017-03-01  6:23     ` Yi Sun
2017-03-08 16:07   ` Jan Beulich
2017-03-10  2:54     ` Yi Sun [this message]
2017-03-10  9:09       ` Jan Beulich
2017-03-13  2:36         ` Yi Sun
2017-03-13 12:35           ` Jan Beulich
2017-03-14  2:43             ` Yi Sun
2017-03-14  6:29               ` Jan Beulich
2017-03-14  9:21                 ` Yi Sun
2017-03-14 10:24                   ` Jan Beulich
2017-03-15  2:52                     ` Yi Sun
2017-03-15  7:40                       ` Jan Beulich
2017-03-15  8:18                         ` Yi Sun
2017-03-15  8:32                           ` Jan Beulich
2017-03-10  7:46     ` Yi Sun
2017-03-10  9:10       ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 09/24] x86: refactor psr: set value: assemble features value array Yi Sun
2017-02-26 17:43   ` Wei Liu
2017-02-27  7:11     ` Yi Sun
2017-02-27 11:45       ` Wei Liu
2017-03-08 16:54   ` Jan Beulich
2017-03-10  3:21     ` Yi Sun
2017-03-10  9:15       ` Jan Beulich
2017-03-13  2:43         ` Yi Sun
2017-03-13 12:37           ` Jan Beulich
2017-03-14  2:20             ` Yi Sun
2017-03-14  6:32               ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 10/24] x86: refactor psr: set value: implement cos finding flow Yi Sun
2017-02-26 17:43   ` Wei Liu
2017-02-27  7:16     ` Yi Sun
2017-03-08 17:03   ` Jan Beulich
2017-03-10  5:35     ` Yi Sun
2017-03-10  9:21       ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 11/24] x86: refactor psr: set value: implement cos id picking flow Yi Sun
2017-02-26 17:43   ` Wei Liu
2017-03-09 14:10   ` Jan Beulich
2017-03-10  5:40     ` Yi Sun
2017-03-10  9:24       ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 12/24] x86: refactor psr: set value: implement write msr flow Yi Sun
2017-02-15  8:49 ` [PATCH v8 13/24] x86: refactor psr: implement CPU init and free flow for CDP Yi Sun
2017-02-28 14:52   ` Roger Pau Monné
2017-03-09 14:53   ` Jan Beulich
2017-03-10  5:50     ` Yi Sun
2017-02-15  8:49 ` [PATCH v8 14/24] x86: refactor psr: implement get hw info " Yi Sun
2017-02-26 17:43   ` Wei Liu
2017-02-28 14:54   ` Roger Pau Monné
2017-02-15  8:49 ` [PATCH v8 15/24] x86: refactor psr: implement get value " Yi Sun
2017-02-28 14:59   ` Roger Pau Monné
2017-02-15  8:49 ` [PATCH v8 16/24] x86: refactor psr: implement set value callback functions " Yi Sun
2017-02-26 17:43   ` Wei Liu
2017-02-27  7:19     ` Yi Sun
2017-02-15  8:49 ` [PATCH v8 17/24] x86: L2 CAT: implement CPU init and free flow Yi Sun
2017-02-28 15:15   ` Roger Pau Monné
2017-03-01  6:35     ` Yi Sun
2017-03-09 15:04   ` Jan Beulich
2017-03-10  5:52     ` Yi Sun
2017-02-15  8:49 ` [PATCH v8 18/24] x86: L2 CAT: implement get hw info flow Yi Sun
2017-02-28 15:18   ` Roger Pau Monné
2017-03-09 15:13   ` Jan Beulich
2017-03-10  5:57     ` Yi Sun
2017-03-10  9:26       ` Jan Beulich
2017-02-15  8:49 ` [PATCH v8 19/24] x86: L2 CAT: implement get value flow Yi Sun
2017-02-28 15:20   ` Roger Pau Monné
2017-02-15  8:49 ` [PATCH v8 20/24] x86: L2 CAT: implement set " Yi Sun
2017-02-28 15:25   ` Roger Pau Monné
2017-03-01  6:59     ` Yi Sun
2017-03-01 11:31       ` Dario Faggioli
2017-02-15  8:49 ` [PATCH v8 21/24] tools: L2 CAT: support get HW info for L2 CAT Yi Sun
2017-02-15  8:49 ` [PATCH v8 22/24] tools: L2 CAT: support show cbm " Yi Sun
2017-02-15  8:49 ` [PATCH v8 23/24] tools: L2 CAT: support set " Yi Sun
2017-02-15  8:49 ` [PATCH v8 24/24] docs: add L2 CAT description in docs Yi Sun
2017-02-15 16:14 ` [PATCH v8 00/24] Enable L2 Cache Allocation Technology & Refactor psr.c Konrad Rzeszutek Wilk
2017-02-26 18:00 ` Wei Liu
2017-02-28 11:02 ` Roger Pau Monné
2017-03-01  4:54   ` Yi Sun
2017-03-01  8:35     ` Roger Pau Monn�
2017-03-01  8:40       ` 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=20170310025422.GF17458@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=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.