All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: Yi Sun <yi.y.sun@linux.intel.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 09/25] x86: refactor psr: L3 CAT: set value: implement framework.
Date: Tue, 28 Mar 2017 02:21:28 -0600	[thread overview]
Message-ID: <58DA39280200007800148E42@prv-mh.provo.novell.com> (raw)
In-Reply-To: <20170328012150.GE17458@yi.y.sun>

>>> On 28.03.17 at 03:21, <yi.y.sun@linux.intel.com> wrote:
> On 17-03-27 03:59:32, Jan Beulich wrote:
>> >>> On 16.03.17 at 12:07, <yi.y.sun@linux.intel.com> wrote:
>> > --- a/xen/arch/x86/domctl.c
>> > +++ b/xen/arch/x86/domctl.c
>> > @@ -1437,21 +1437,21 @@ long arch_do_domctl(
>> >          switch ( domctl->u.psr_cat_op.cmd )
>> >          {
>> >          case XEN_DOMCTL_PSR_CAT_OP_SET_L3_CBM:
>> > -            ret = psr_set_l3_cbm(d, domctl->u.psr_cat_op.target,
>> > -                                 domctl->u.psr_cat_op.data,
>> > -                                 PSR_CBM_TYPE_L3);
>> > +            ret = psr_set_val(d, domctl->u.psr_cat_op.target,
>> > +                              (uint32_t)domctl->u.psr_cat_op.data,
>> 
>> The cast here is pointless, but - along the lines of the comment
>> on the earlier patch - indicates a problem: You silently ignore the
>> upper 32-bit the caller handed you. I think for forward
>> compatibility it would be better if you checked they're zero. And
>> in such a check you could then use a cast which I would not
>> grumble about:
>> 
>>     if ( domctl->u.psr_cat_op.data != (uint32_t)domctl->u.psr_cat_op.data )
>>         return -E...;
>> 
> Thanks for the suggestion! I will check the 'data' for both get_val/set_val.

There's no data to check on the "get" path - you return data there.

>> > +static int find_cos(const uint32_t val[], uint32_t array_len,
>> > +                    enum psr_feat_type feat_type,
>> > +                    const struct psr_socket_info *info)
>> > +{
>> > +    ASSERT(spin_is_locked((spinlock_t *)(&info->ref_lock)));
>> 
>> Excuse me, but no, this is another of those really bad casts. I
>> guess you've added it to deal with info being pointer-to-const.
>> In such a case you should instead drop the const, unless the
>> consuming function can be made take a pointer-to-const (which
>> isn't the case here, as check_lock() wants to write into the
>> structure).
>> 
> Sorry for this. Will pass '&info->ref_lock' as a parameter into the function
> to check it.

That's suitable if you don't need "info" for anything else. Otherwise
- as said - you should drop const from info.

>> > +     * are same as the array. Then, we can reuse this COS ID.
>> > +     */
>> > +    cos = find_cos(val_array, array_len, feat_type, info);
>> > +    if ( cos == old_cos )
>> > +    {
>> > +        ret = 0;
>> > +        goto unlock_free_array;
>> > +    }
>> > +    else if ( cos >= 0 )
>> 
>> Pointless "else".
>> 
> Ok.
> 
>> > +        goto cos_found;
>> 
>> I think it would be better not to use goto here, other than for the
>> error handling parts (where I don't really like it either, but I do
>> accept it since others think that's the least ugly way).
>> 
> Sorry, I don't understand your meaning here. DYM I should goto error handling
> route? 'cos >= 0' means a valid cos id has been found. Then, we should do the
> 'cos_found' process to handle ref and set cos id into domain.

Using goto for error handling is acceptable, as said. But please use

    if ( cos < 0 )
    {
    }

followed by the code that's now after the cos_found label.

>> > +    /*
>> > +     * Step 5:
>> > +     * Update ref according to COS ID.
>> > +     */
>> > +    ref[cos]++;
>> > +    ASSERT(!cos || ref[cos]);
>> > +    ASSERT(!old_cos || ref[old_cos]);
>> > +    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;
>> > +    goto free_array;
>> > +
>> > +unlock_free_array:
>> > +    spin_unlock(&info->ref_lock);
>> > +free_array:
>> > +    xfree(val_array);
>> > +    return ret;
>> > +}
>> 
>> I think overall things would look better if the successful path was the
>> straight (goto-free) one.
>> 
> DYM change 'free_array' to 'free'?

My remark was not about label names, but about code flow: Please
use goto only for error paths, unless not using it on normal paths
means unacceptable resulting code (use your own judgment).

>> >  /* Called with domain lock held, no extra lock needed for 'psr_cos_ids' */
>> >  static void psr_free_cos(struct domain *d)
>> >  {
>> > +    unsigned int socket, cos;
>> > +
>> > +    if ( !socket_info || !d->arch.psr_cos_ids )
>> > +        return;
>> 
>> Can d->arch.psr_cos_ids be non-NULL when !socket_info? If not,
>> check only the former with an if(), and ASSERT() the latter.
>> 
> In normal case, 'psr_cos_ids' should not be NULL when entering this function.
> So, I think ASSERT() is a good option. Thanks!

What does "normal" mean to you here? If, e.g. due to an error
during domain creation, we can come here with the pointer
being NULL, you must not ASSERT() but use if() instead. Please
note that my earlier comment did _not_ suggest to replace the
checking of d->arch.psr_cos_ids, but that of socket_info (as
long as the answer to the question is "no").

>> > +    /* Domain is destroied so its cos_ref should be decreased. */
>> > +    for ( socket = 0; socket < nr_sockets; socket++ )
>> > +    {
>> > +        struct psr_socket_info *info;
>> > +
>> > +        /* cos 0 is default one which does not need be handled. */
>> > +        cos = d->arch.psr_cos_ids[socket];
>> > +        if ( cos == 0 )
>> > +            continue;
>> > +
>> > +        /*
>> > +         * If domain uses other cos ids, all corresponding refs must have been
>> > +         * increased 1 for this domain. So, we need decrease them.
>> 
>> ... by 1 ... need to ... I also question the presence of the word
>> "must" in here.
>> 
> After considering this comments again, I think the purpose of this piece of
> codes has been explained outer the circle. So, I think this comment can be
> removed. Is that OK for you?

If "outer the circle" means "outside of the loop", then yes, that earlier
comment should be sufficient on its own.

Jan

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

  reply	other threads:[~2017-03-28  8:21 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 [this message]
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
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=58DA39280200007800148E42@prv-mh.provo.novell.com \
    --to=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 \
    --cc=yi.y.sun@linux.intel.com \
    /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.