From: Chao Peng <chao.p.peng@linux.intel.com>
To: He Chen <he.chen@linux.intel.com>
Cc: wei.liu2@citrix.com, ian.campbell@citrix.com,
stefano.stabellini@eu.citrix.com, andrew.cooper3@citrix.com,
ian.jackson@eu.citrix.com, jbeulich@suse.com,
xen-devel@lists.xenproject.org, keir@xen.org
Subject: Re: [PATCH v2 2/4] x86: add domctl cmd to set/get CDP code/data CBM
Date: Wed, 9 Sep 2015 15:24:08 +0800 [thread overview]
Message-ID: <20150909072408.GO19417@pengc-linux.bj.intel.com> (raw)
In-Reply-To: <1441775808-29766-3-git-send-email-he.chen@linux.intel.com>
On Wed, Sep 09, 2015 at 01:16:46PM +0800, He Chen wrote:
> CDP extends CAT and provides the capacity to control L3 code & data
> cache. With CDP, one COS correspond to two CMBs(code & data). cbm_type
> is added to support distinguish different CBM operation. Besides, new
> domctl cmds are introdunced to support set/get CDP CBM. Some CAT
> functions to operation CBMs are extended to support CDP.
>
> Signed-off-by: He Chen <he.chen@linux.intel.com>
> ---
> xen/arch/x86/domctl.c | 32 ++++++++-
> xen/arch/x86/psr.c | 163 ++++++++++++++++++++++++++++++++++----------
> xen/include/asm-x86/psr.h | 12 +++-
> xen/include/public/domctl.h | 4 ++
> 4 files changed, 170 insertions(+), 41 deletions(-)
>
> diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
> index bf62a88..734fddb 100644
> --- a/xen/arch/x86/domctl.c
>
> -int psr_get_l3_cbm(struct domain *d, unsigned int socket, uint64_t *cbm)
> +int psr_get_l3_cbm(struct domain *d, unsigned int socket,
> + uint64_t *cbm, enum cbm_type type)
> {
> struct psr_cat_socket_info *info = get_cat_socket_info(socket);
>
> if ( IS_ERR(info) )
> return PTR_ERR(info);
>
> - *cbm = info->cos_to_cbm[d->arch.psr_cos_ids[socket]].u.cbm;
> + if ( type == PSR_CBM_TYPE_L3 )
> + {
> + if ( info->cdp_enabled )
> + return -EXDEV;
> + *cbm = info->cos_to_cbm[d->arch.psr_cos_ids[socket]].u.cbm;
> + }
> + else if ( type == PSR_CBM_TYPE_L3_CODE )
> + {
> + if ( !info->cdp_enabled )
> + return -EXDEV;
> + *cbm = info->cos_to_cbm[d->arch.psr_cos_ids[socket]].u.cdp.code;
> + }
> + else
> + {
> + if ( !info->cdp_enabled )
> + return -EXDEV;
> + *cbm = info->cos_to_cbm[d->arch.psr_cos_ids[socket]].u.cdp.data;
> + }
Could I suggest to use switch? And the check can be done in advance.
>
> return 0;
> }
> @@ -371,65 +389,136 @@ static int write_l3_cbm(unsigned int socket, unsigned int cos,
> return 0;
> }
>
> -int psr_set_l3_cbm(struct domain *d, unsigned int socket, uint64_t cbm)
> +static int find_cos(struct psr_cat_cbm *map, int cos_max,
> + uint64_t cbm_code, uint64_t cbm_data, bool_t cdp_enabled)
> {
> - unsigned int old_cos, cos;
> - struct psr_cat_cbm *map, *found = NULL;
> + unsigned int cos;
> +
> + if ( !cdp_enabled )
> + {
> + for ( cos = 0; cos <= cos_max; cos++ )
> + if ( map[cos].ref && map[cos].u.cbm == cbm_code )
> + return cos;
> + }
> + else
> + {
> + for ( cos = 0; cos <= cos_max; cos++ )
> + if ( map[cos].ref && map[cos].u.cdp.code == cbm_code &&
> + map[cos].u.cdp.data == cbm_data )
> + return cos;
> + }
I guess the '{' and '}' can be omitted if the body contains only one
sentence.
> +
> + return -ENOENT;
> +}
> +
> +static int pick_avail_cos(struct psr_cat_cbm *map, int cos_max, int old_cos)
> +{
> + int cos;
> +
> + /* If old cos is referred only by the domain, then use it. */
> + if ( map[old_cos].ref == 1 )
> + return old_cos;
> +
> + /* Then we pick an unused one, never pick 0 */
Find an unused one other than cos0.
> + for ( cos = 1; cos <= cos_max; cos++ )
> + if ( map[cos].ref == 0 )
> + return cos;
> +
> + return -ENOENT;
> +}
> +
> +int psr_set_l3_cbm(struct domain *d, unsigned int socket,
> + uint64_t cbm, enum cbm_type type)
> +{
> + unsigned int old_cos, cos_max;
> + int cos, ret;
> + uint64_t cbm_data, cbm_code;
> + bool_t need_write = 1;
> + struct psr_cat_cbm *map;
> struct psr_cat_socket_info *info = get_cat_socket_info(socket);
>
> if ( IS_ERR(info) )
> return PTR_ERR(info);
>
> + cbm_code = (1ull << info->cbm_len) - 1;
> + cbm_data = (1ull << info->cbm_len) - 1;
Why this is needed, as you will give them the value eventually.
> if ( !psr_check_cbm(info->cbm_len, cbm) )
> return -EINVAL;
>
> + cos_max = info->cos_max;
> old_cos = d->arch.psr_cos_ids[socket];
> map = info->cos_to_cbm;
>
> - spin_lock(&info->cbm_lock);
> -
> - for ( cos = 0; cos <= info->cos_max; cos++ )
> + switch( type )
Coding style.
Chao
> {
> - /* If still not found, then keep unused one. */
> - if ( !found && cos != 0 && map[cos].ref == 0 )
> - found = map + cos;
> - else if ( map[cos].u.cbm == cbm )
> - {
> - if ( unlikely(cos == old_cos) )
> - {
> - ASSERT(cos == 0 || map[cos].ref != 0);
> - spin_unlock(&info->cbm_lock);
> - return 0;
> - }
> - found = map + cos;
> + case PSR_CBM_TYPE_L3:
> + if ( info->cdp_enabled )
> + return -EINVAL;
> + cbm_code = cbm;
> + cbm_data = cbm;
> break;
> - }
> - }
>
> - /* If old cos is referred only by the domain, then use it. */
> - if ( !found && map[old_cos].ref == 1 )
> - found = map + old_cos;
> + case PSR_CBM_TYPE_L3_CODE:
> + if ( !info->cdp_enabled )
> + return -EINVAL;
> + cbm_code = cbm;
> + cbm_data = map[old_cos].u.cdp.data;
> + break;
>
> - if ( !found )
> - {
> - spin_unlock(&info->cbm_lock);
> - return -EOVERFLOW;
> + case PSR_CBM_TYPE_L3_DATA:
> + if ( !info->cdp_enabled )
> + return -EINVAL;
> + cbm_code = map[old_cos].u.cdp.code;
> + cbm_data = cbm;
> + break;
> +
> + default:
> + return -EINVAL;
> }
>
> - cos = found - map;
> - if ( found->u.cbm != cbm )
> + spin_lock(&info->cbm_lock);
> + cos = find_cos(map, cos_max, cbm_code, cbm_data, info->cdp_enabled);
> + if ( cos >= 0 )
> {
> - int ret = write_l3_cbm(socket, cos, cbm, 0, 0);
> -
> - if ( ret )
> + if ( unlikely(cos == old_cos) )
> {
> spin_unlock(&info->cbm_lock);
> - return ret;
> + return 0;
> + }
> + }
> + else
> + {
> + cos = pick_avail_cos(map, cos_max, old_cos);
> + if ( cos < 0 )
> + {
> + spin_unlock(&info->cbm_lock);
> + return cos;
> + }
> +
> + /* We try to avoid writing MSR */
> + if ( info->cdp_enabled )
> + {
> + if ( map[cos].u.cdp.code == cbm_code &&
> + map[cos].u.cdp.data == cbm_data )
> + need_write = 0;
> + }
> + else
> + need_write = map[cos].u.cbm == cbm_code ? 0 : 1;
> +
> + if ( need_write )
> + {
> + ret = write_l3_cbm(socket, cos, cbm_code, cbm_data, info->cdp_enabled);
> + if ( ret )
> + {
> + spin_unlock(&info->cbm_lock);
> + return ret;
> + }
> + map[cos].u.cdp.code = cbm_code;
> + map[cos].u.cdp.data = cbm_data;
> }
> - found->u.cbm = cbm;
> }
>
> - found->ref++;
> + map[cos].ref++;
> map[old_cos].ref--;
> spin_unlock(&info->cbm_lock);
>
next prev parent reply other threads:[~2015-09-09 7:27 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-09 5:16 [PATCH v2 0/4] Intel Code/Data Prioritization(CDP) feature enabling He Chen
2015-09-09 5:16 ` [PATCH v2 1/4] x86: Support enable CDP by boot parameter and add get CDP status He Chen
2015-09-09 7:04 ` Chao Peng
2015-09-09 7:44 ` He Chen
2015-09-09 5:16 ` [PATCH v2 2/4] x86: add domctl cmd to set/get CDP code/data CBM He Chen
2015-09-09 7:24 ` Chao Peng [this message]
2015-09-09 7:35 ` Jan Beulich
2015-09-09 5:16 ` [PATCH v2 3/4] tools: add tools support for Intel CDP He Chen
2015-09-09 7:32 ` Chao Peng
2015-09-09 8:10 ` He Chen
2015-09-09 8:37 ` Jan Beulich
2015-09-09 9:17 ` Chao Peng
2015-09-09 5:16 ` [PATCH v2 4/4] docs: add document to introduce CDP command He Chen
2015-09-09 7:37 ` [PATCH v2 0/4] Intel Code/Data Prioritization(CDP) feature enabling Chao Peng
2015-09-09 12:36 ` Ian Campbell
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=20150909072408.GO19417@pengc-linux.bj.intel.com \
--to=chao.p.peng@linux.intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=he.chen@linux.intel.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=stefano.stabellini@eu.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.