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 v12 08/23] x86: refactor psr: L3 CAT: set value: implement framework.
Date: Thu, 29 Jun 2017 15:21:03 +0800 [thread overview]
Message-ID: <20170629072103.GC3420@yi.y.sun> (raw)
In-Reply-To: <59549D3202000078001016B3@prv-mh.provo.novell.com>
On 17-06-29 00:24:50, Jan Beulich wrote:
> >>> Yi Sun <yi.y.sun@linux.intel.com> 06/29/17 7:12 AM >>>
> >On 17-06-28 05:43:58, Jan Beulich wrote:
> >> >>> Yi Sun <yi.y.sun@linux.intel.com> 06/28/17 11:10 AM >>>
> >> >On 17-06-28 01:14:59, Jan Beulich wrote:
> >> >> >>> Yi Sun <yi.y.sun@linux.intel.com> 06/14/17 3:25 AM >>>
> >> >> > @@ -537,7 +556,16 @@ int psr_get_val(struct domain *d, unsigned int socket,
> >> >> > return -ENOENT;
> >> >> > }
> >> >> >
> >> >> > + domain_lock(d);
> >> >> > + if ( !test_bit(d->domain_id, socket_info[socket].dom_set) )
> >> >> > + {
> >> >> > + d->arch.psr_cos_ids[socket] = 0;
> >> >> > + set_bit(d->domain_id, socket_info[socket].dom_set);
> >> >> > + }
> >> >>
> >> >> Any reason not to use test_and_set_bit() here? I.e. is this on any hot path?
> >> >> Or wait - I think it's even wrong to split the test from the set, as the lock
> >> >> doesn't protect dom_set[].
> >>
> >> With the last sentence here (which I had added after having written all of the
> >> rest of the reply, I'm afraid I've managed to confuse you:
> >>
> >> >>>
> >> >>Will change it to test_and_set_bit.
> >> >...
> >> >> > + /*
> >> >> > + * 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.
> >> >> > + */
> >> >> > + domain_lock(d);
> >> >> > + d->arch.psr_cos_ids[socket] = cos;
> >> >> > + domain_unlock(d);
> >> >> > +
> >> >> > + /*
> >> >> > + * Step 7:
> >> >> > + * Then, set the dom_set bit which corresponds to domain_id to mark this
> >> >> > + * domain has been set and the COS ID of the domain is valid.
> >> >> > + */
> >> >> > + set_bit(d->domain_id, info->dom_set);
> >> >>
> >> >> With the way things are being done above, doesn't this belong in the
> >> >> domain_lock()-ed region?
> >>
> >> I should have deleted this, since - as said above - the lock doesn't guard
> >> against anything dom_set[]-wise. So ...
> >>
> >> >Yes, should be. Thanks!
> >>
> >> ... I think you rather shouldn't do this. Instead you may want to consider whether
> >> the other domain_lock()-ed regions couldn't be further shrunk.
> >>
> >I want to confirm below two points with you:
> >1. remove this 'set_bit' here if above 'test_bit' is replaced to
> >'test_and_set_bit'.
>
> I don't think so, at least not for the ones still visible in context here. I've only
> suggested to convert test/set pairs into test_and_set. The one at step 7 doesn't
> have a test next to it, so either it was redundant with some other set (in which
> case it should indeed be dropped), or it needs to stay as is.
>
For the 'set_bit' at Step 7, it is redundant because the bit has been set anyway
when entering 'psr_set_val' if we use 'test_and_set_bit' there. So, I think we
can drop Step 7.
> >2. For the 'be further shrunk', I think the 'domain_lock' above 'set_bit' can be
> >removed if 'test_and_set_bit' is used.
>
> I don't think it can be removed altogether, but I think it could be moved into the
> body of the if().
>
I think we still need to keep the lock protection range in current codes. We
need the lock to protect the action to get 'cos id' too.
There is a scenario to explain this: if the domain's bit in dom_set has been
cleared, 'psr_get_val' and 'psr_set_val' are called almost at same time, but
'psr_get_val' is a little bit eariler. It sets dom_set bit to 1 firstly. At
that time, 'psr_set_val' checks the bit and finds it has been set, it goes to
next instruction to get old_cos. But the 'psr_get_val' may not restore the
cos id to 0 yet. So, the old_cos got in 'psr_set_val' is wrong. To avoid
this, I think should use current codes to protect the whole range.
psr_get_val() psr_set_val()
//old bit is 0, enter statement.
if (!test_and_set_bit())
{
//old bit is 1, skip statement.
if (!test_and_set_bit())
old_cos = d->arch.psr_cos_ids[socket];
domain_lock();
d->arch.psr_cos_ids[socket] = 0;
domain_unlock();
}
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-06-29 7:21 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-14 1:12 [PATCH v12 00/23] Enable L2 Cache Allocation Technology & Refactor psr.c Yi Sun
2017-06-14 1:12 ` [PATCH v12 01/23] docs: create Cache Allocation Technology (CAT) and Code and Data Prioritization (CDP) feature document Yi Sun
2017-06-14 1:12 ` [PATCH v12 02/23] x86: move cpuid_count_leaf from cpuid.c to processor.h Yi Sun
2017-06-14 1:12 ` [PATCH v12 03/23] x86: refactor psr: remove L3 CAT/CDP codes Yi Sun
2017-06-14 1:12 ` [PATCH v12 04/23] x86: refactor psr: L3 CAT: implement main data structures, CPU init and free flows Yi Sun
2017-06-28 7:12 ` Jan Beulich
2017-06-28 9:07 ` Yi Sun
2017-06-14 1:12 ` [PATCH v12 05/23] x86: refactor psr: L3 CAT: implement Domain init/free and schedule flows Yi Sun
2017-06-28 7:13 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 06/23] x86: refactor psr: L3 CAT: implement get hw info flow Yi Sun
2017-06-14 1:12 ` [PATCH v12 07/23] x86: refactor psr: L3 CAT: implement get value flow Yi Sun
2017-06-28 7:14 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 08/23] x86: refactor psr: L3 CAT: set value: implement framework Yi Sun
2017-06-28 7:14 ` Jan Beulich
2017-06-28 9:09 ` Yi Sun
2017-06-28 11:43 ` Jan Beulich
2017-06-29 5:12 ` Yi Sun
2017-06-29 6:24 ` Jan Beulich
2017-06-29 7:21 ` Yi Sun [this message]
2017-06-14 1:12 ` [PATCH v12 09/23] x86: refactor psr: L3 CAT: set value: assemble features value array Yi Sun
2017-06-29 17:56 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 10/23] x86: refactor psr: L3 CAT: set value: implement cos finding flow Yi Sun
2017-06-29 17:57 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 11/23] x86: refactor psr: L3 CAT: set value: implement cos id picking flow Yi Sun
2017-06-29 17:59 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 12/23] x86: refactor psr: L3 CAT: set value: implement write msr flow Yi Sun
2017-06-29 18:00 ` Jan Beulich
2017-06-30 5:45 ` Yi Sun
2017-06-30 6:45 ` Jan Beulich
2017-06-30 7:08 ` Yi Sun
2017-06-14 1:12 ` [PATCH v12 13/23] x86: refactor psr: CDP: implement CPU init flow Yi Sun
2017-06-30 6:40 ` Jan Beulich
2017-06-30 6:59 ` Yi Sun
2017-06-30 7:33 ` Jan Beulich
2017-06-30 8:04 ` Yi Sun
2017-06-30 9:18 ` Jan Beulich
2017-07-04 1:40 ` Yi Sun
2017-07-04 7:28 ` Jan Beulich
2017-07-05 1:45 ` Yi Sun
2017-06-14 1:12 ` [PATCH v12 14/23] x86: refactor psr: CDP: implement get hw info flow Yi Sun
2017-06-30 6:41 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 15/23] x86: refactor psr: CDP: implement set value callback function Yi Sun
2017-06-30 6:42 ` Jan Beulich
2017-06-30 7:22 ` Yi Sun
2017-06-30 8:54 ` Yi Sun
2017-06-30 9:33 ` Jan Beulich
2017-06-30 11:29 ` Yi Sun
2017-06-30 12:02 ` Jan Beulich
2017-07-03 6:33 ` Yi Sun
2017-07-03 7:01 ` Jan Beulich
2017-07-03 8:40 ` Yi Sun
2017-07-03 9:18 ` Jan Beulich
2017-07-03 12:52 ` Yi Sun
2017-07-03 13:02 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 16/23] x86: L2 CAT: implement CPU init flow Yi Sun
2017-06-30 6:58 ` Jan Beulich
2017-06-30 7:27 ` Yi Sun
2017-06-30 7:36 ` Jan Beulich
2017-06-30 8:05 ` Yi Sun
2017-06-14 1:12 ` [PATCH v12 17/23] x86: L2 CAT: implement get hw info flow Yi Sun
2017-06-30 6:59 ` Jan Beulich
2017-06-14 1:12 ` [PATCH v12 18/23] x86: L2 CAT: implement get value flow Yi Sun
2017-06-14 1:12 ` [PATCH v12 19/23] x86: L2 CAT: implement set " Yi Sun
2017-06-14 1:12 ` [PATCH v12 20/23] tools: L2 CAT: support get HW info for L2 CAT Yi Sun
2017-06-14 1:12 ` [PATCH v12 21/23] tools: L2 CAT: support show cbm " Yi Sun
2017-06-14 1:12 ` [PATCH v12 22/23] tools: L2 CAT: support set " Yi Sun
2017-06-14 1:12 ` [PATCH v12 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=20170629072103.GC3420@yi.y.sun \
--to=yi.y.sun@linux.intel.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=jbeulich@suse.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).