All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yi Sun <yi.y.sun@linux.intel.com>
To: xen-devel@lists.xenproject.org
Cc: "Wei Liu" <wei.liu2@citrix.com>,
	"Chao Peng" <chao.p.peng@linux.intel.com>,
	"Yi Sun" <yi.y.sun@linux.intel.com>,
	"Ian Jackson" <ian.jackson@eu.citrix.com>,
	"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [PATCH v9 10/16] tools: implement the new libxc get hw info interface
Date: Fri, 20 Oct 2017 16:28:22 +0800	[thread overview]
Message-ID: <1508488108-7071-11-git-send-email-yi.y.sun@linux.intel.com> (raw)
In-Reply-To: <1508488108-7071-1-git-send-email-yi.y.sun@linux.intel.com>

This patch implements a new libxc get hw info interface and corresponding
data structures. It also changes libxl_psr.c to call this new interface.

Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
---
CC: Wei Liu <wei.liu2@citrix.com>
CC: Ian Jackson <ian.jackson@eu.citrix.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Chao Peng <chao.p.peng@linux.intel.com>

v6:
    - remove unnecessary spaces in brackets.
      (suggested by Wei Liu)
    - use assert to check input lvl.
      (suggested by Roger Pau Monné)
v5:
    - directly define 'xc_psr_hw_info' as union type.
      (suggested by Roger Pau Monné)
    - converge L2 and L3 cases in 'xc_psr_get_hw_info'.
      (suggested by Roger Pau Monné)
v4:
    - remove 'ALLOC_' from macro names.
      (suggested by Roger Pau Monné)
    - remove 'XC_PSR_FEAT_UNKNOWN' which is not necessary.
      (suggested by Roger Pau Monné)
    - remove 'FEAT_' from enum item names.
      (suggested by Roger Pau Monné)
    - remove 'xc_' from struct name.
      (suggested by Roger Pau Monné)
    - adjust codes to reduce indentation.
      (suggested by Roger Pau Monné)
    - assert for not happened case.
      (suggested by Roger Pau Monné)
    - add LOGE to show errno.
      (suggested by Roger Pau Monné)
v3:
    - rename 'psr_cat/PSR_CAT' to 'psr_alloc/PSR_ALLOC' and remove 'op/OP'
      from name.
      (suggested by Roger Pau Monné)
    - remove 'info' from 'xc_cat_info' and 'xc_mba_info'.
      (suggested by Roger Pau Monné)
    - set errno in 'xc_psr_get_hw_info'.
      (suggested by Roger Pau Monné)
    - remove 'inline'.
      (suggested by Roger Pau Monné)
    - remove 'psr' from 'libxl__psr_feat_type_to_libxc_psr_feat_type' to make
      function name shorter.
      (suggested by Roger Pau Monné)
    - check 'xc_type' in 'libxl_psr_cat_get_info'.
      (suggested by Roger Pau Monné)
v2:
    - split this patch out from a big patch in v1.
      (suggested by Wei Liu)
    - change 'CAT_INFO' and 'MBA_INFO' to 'CAT' and 'MBA'.
      (suggested by Chao Peng)
---
 tools/libxc/include/xenctrl.h | 27 ++++++++++++++++++---
 tools/libxc/xc_psr.c          | 55 +++++++++++++++++++++++++++----------------
 tools/libxl/libxl_psr.c       | 38 ++++++++++++++++++++++++++++--
 3 files changed, 95 insertions(+), 25 deletions(-)

diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index 666db0b..9fc3348 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -2494,6 +2494,28 @@ enum xc_psr_cat_type {
 };
 typedef enum xc_psr_cat_type xc_psr_cat_type;
 
+enum xc_psr_feat_type {
+    XC_PSR_CAT_L3,
+    XC_PSR_CAT_L2,
+    XC_PSR_MBA,
+};
+typedef enum xc_psr_feat_type xc_psr_feat_type;
+
+union xc_psr_hw_info {
+    struct {
+        uint32_t cos_max;
+        uint32_t cbm_len;
+        bool     cdp_enabled;
+    } cat;
+
+    struct {
+        uint32_t cos_max;
+        uint32_t thrtl_max;
+        bool     linear;
+    } mba;
+};
+typedef union xc_psr_hw_info xc_psr_hw_info;
+
 int xc_psr_cmt_attach(xc_interface *xch, uint32_t domid);
 int xc_psr_cmt_detach(xc_interface *xch, uint32_t domid);
 int xc_psr_cmt_get_domain_rmid(xc_interface *xch, uint32_t domid,
@@ -2515,9 +2537,8 @@ int xc_psr_cat_set_domain_data(xc_interface *xch, uint32_t domid,
 int xc_psr_cat_get_domain_data(xc_interface *xch, uint32_t domid,
                                xc_psr_cat_type type, uint32_t target,
                                uint64_t *data);
-int xc_psr_cat_get_info(xc_interface *xch, uint32_t socket, unsigned int lvl,
-                        uint32_t *cos_max, uint32_t *cbm_len,
-                        bool *cdp_enabled);
+int xc_psr_get_hw_info(xc_interface *xch, uint32_t socket,
+                       xc_psr_feat_type type, xc_psr_hw_info *hw_info);
 
 int xc_get_cpu_levelling_caps(xc_interface *xch, uint32_t *caps);
 int xc_get_cpu_featureset(xc_interface *xch, uint32_t index,
diff --git a/tools/libxc/xc_psr.c b/tools/libxc/xc_psr.c
index 78deba0..2335842 100644
--- a/tools/libxc/xc_psr.c
+++ b/tools/libxc/xc_psr.c
@@ -323,37 +323,52 @@ int xc_psr_cat_get_domain_data(xc_interface *xch, uint32_t domid,
     return rc;
 }
 
-int xc_psr_cat_get_info(xc_interface *xch, uint32_t socket, unsigned int lvl,
-                        uint32_t *cos_max, uint32_t *cbm_len, bool *cdp_enabled)
+int xc_psr_get_hw_info(xc_interface *xch, uint32_t socket,
+                       xc_psr_feat_type type, xc_psr_hw_info *hw_info)
 {
     int rc = -1;
     DECLARE_SYSCTL;
 
+    if ( !hw_info )
+    {
+        errno = EINVAL;
+        return rc;
+    }
+
     sysctl.cmd = XEN_SYSCTL_psr_alloc;
     sysctl.u.psr_alloc.target = socket;
 
-    switch ( lvl )
+    switch ( type )
     {
-    case 2:
-        sysctl.u.psr_alloc.cmd = XEN_SYSCTL_PSR_get_l2_info;
+    case XC_PSR_CAT_L2:
+    case XC_PSR_CAT_L3:
+        sysctl.u.psr_alloc.cmd = (type == XC_PSR_CAT_L2) ?
+                                 XEN_SYSCTL_PSR_get_l2_info :
+                                 XEN_SYSCTL_PSR_get_l3_info;
+
         rc = xc_sysctl(xch, &sysctl);
-        if ( !rc )
-        {
-            *cos_max = sysctl.u.psr_alloc.u.cat_info.cos_max;
-            *cbm_len = sysctl.u.psr_alloc.u.cat_info.cbm_len;
-            *cdp_enabled = false;
-        }
+        if ( rc )
+            break;
+
+        hw_info->cat.cos_max = sysctl.u.psr_alloc.u.cat_info.cos_max;
+        hw_info->cat.cbm_len = sysctl.u.psr_alloc.u.cat_info.cbm_len;
+        hw_info->cat.cdp_enabled = (type == XC_PSR_CAT_L2) ?
+                                   false :
+                                   (sysctl.u.psr_alloc.u.cat_info.flags &
+                                    XEN_SYSCTL_PSR_CAT_L3_CDP);
+
         break;
-    case 3:
-        sysctl.u.psr_alloc.cmd = XEN_SYSCTL_PSR_get_l3_info;
+    case XC_PSR_MBA:
+        sysctl.u.psr_alloc.cmd = XEN_SYSCTL_PSR_get_mba_info;
         rc = xc_sysctl(xch, &sysctl);
-        if ( !rc )
-        {
-            *cos_max = sysctl.u.psr_alloc.u.cat_info.cos_max;
-            *cbm_len = sysctl.u.psr_alloc.u.cat_info.cbm_len;
-            *cdp_enabled = sysctl.u.psr_alloc.u.cat_info.flags &
-                           XEN_SYSCTL_PSR_CAT_L3_CDP;
-        }
+        if ( rc )
+            break;
+
+        hw_info->mba.cos_max = sysctl.u.psr_alloc.u.mba_info.cos_max;
+        hw_info->mba.thrtl_max = sysctl.u.psr_alloc.u.mba_info.thrtl_max;
+        hw_info->mba.linear = sysctl.u.psr_alloc.u.mba_info.flags &
+                              XEN_SYSCTL_PSR_MBA_LINEAR;
+
         break;
     default:
         errno = EOPNOTSUPP;
diff --git a/tools/libxl/libxl_psr.c b/tools/libxl/libxl_psr.c
index d4f5f67..e1cc250 100644
--- a/tools/libxl/libxl_psr.c
+++ b/tools/libxl/libxl_psr.c
@@ -361,6 +361,31 @@ int libxl_psr_cat_get_cbm(libxl_ctx *ctx, uint32_t domid,
     return rc;
 }
 
+static xc_psr_feat_type libxl__feat_type_to_libxc_feat_type(
+                            libxl_psr_feat_type type, unsigned int lvl)
+{
+    xc_psr_feat_type xc_type;
+
+    switch (type) {
+    case LIBXL_PSR_FEAT_TYPE_CAT:
+        assert(lvl == 3 || lvl == 2);
+
+        if (lvl == 3)
+            xc_type = XC_PSR_CAT_L3;
+        if (lvl == 2)
+            xc_type = XC_PSR_CAT_L2;
+        break;
+    case LIBXL_PSR_FEAT_TYPE_MBA:
+        xc_type = XC_PSR_MBA;
+        break;
+    default:
+        /* Could not happen */
+        assert(0);
+    }
+
+    return xc_type;
+}
+
 int libxl_psr_cat_get_info(libxl_ctx *ctx, libxl_psr_cat_info **info,
                            unsigned int *nr, unsigned int lvl)
 {
@@ -369,6 +394,8 @@ int libxl_psr_cat_get_info(libxl_ctx *ctx, libxl_psr_cat_info **info,
     int i = 0, socketid, nr_sockets;
     libxl_bitmap socketmap;
     libxl_psr_cat_info *ptr;
+    xc_psr_hw_info hw_info;
+    xc_psr_feat_type xc_type;
 
     libxl_bitmap_init(&socketmap);
 
@@ -385,16 +412,23 @@ int libxl_psr_cat_get_info(libxl_ctx *ctx, libxl_psr_cat_info **info,
         goto out;
     }
 
+    xc_type = libxl__feat_type_to_libxc_feat_type(LIBXL_PSR_FEAT_TYPE_CAT, lvl);
+
     ptr = libxl__malloc(NOGC, nr_sockets * sizeof(libxl_psr_cat_info));
 
     libxl_for_each_set_bit(socketid, socketmap) {
         ptr[i].id = socketid;
-        if (xc_psr_cat_get_info(ctx->xch, socketid, lvl, &ptr[i].cos_max,
-                                &ptr[i].cbm_len, &ptr[i].cdp_enabled)) {
+        if (xc_psr_get_hw_info(ctx->xch, socketid, xc_type, &hw_info)) {
+            LOGE(ERROR, "failed to get hw info");
             rc = ERROR_FAIL;
             free(ptr);
             goto out;
         }
+
+        ptr[i].cos_max = hw_info.cat.cos_max;
+        ptr[i].cbm_len = hw_info.cat.cbm_len;
+        ptr[i].cdp_enabled = hw_info.cat.cdp_enabled;
+
         i++;
     }
 
-- 
1.9.1


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

  parent reply	other threads:[~2017-10-20  8:50 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-20  8:28 [PATCH v9 00/16] Enable Memory Bandwidth Allocation in Xen Yi Sun
2017-10-20  8:28 ` [PATCH v9 01/16] docs: create Memory Bandwidth Allocation (MBA) feature document Yi Sun
2017-10-20  8:28 ` [PATCH v9 02/16] Rename PSR sysctl/domctl interfaces and xsm policy to make them be general Yi Sun
2017-10-24  9:10   ` [PATCH v9.1 " Yi Sun
2017-10-24 12:27     ` Jan Beulich
2017-10-30  7:59       ` Yi Sun
2017-10-30 17:22     ` Daniel De Graaf
2017-10-20  8:28 ` [PATCH v9 03/16] x86: rename 'cbm_type' to 'psr_type' to make it general Yi Sun
2017-10-20  8:28 ` [PATCH v9 04/16] x86: a few optimizations to psr codes Yi Sun
2017-10-20  8:28 ` [PATCH v9 05/16] x86: implement data structure and CPU init flow for MBA Yi Sun
2017-10-20  8:28 ` [PATCH v9 06/16] x86: implement get hw info " Yi Sun
2017-12-15 10:09   ` Jan Beulich
2017-12-18  9:38     ` Yi Sun
2017-12-18  8:30   ` [PATCH v9.1 " Yi Sun
2017-12-18 10:21     ` Jan Beulich
2017-10-20  8:28 ` [PATCH v9 07/16] x86: implement get value interface " Yi Sun
2017-10-20  8:28 ` [PATCH v9 08/16] x86: implement set value flow " Yi Sun
2017-10-20  8:28 ` [PATCH v9 09/16] tools: create general interfaces to support psr allocation features Yi Sun
2017-10-20  8:28 ` Yi Sun [this message]
2017-10-20  8:28 ` [PATCH v9 11/16] tools: implement the new libxl get hw info interface Yi Sun
2017-10-20  8:28 ` [PATCH v9 12/16] tools: implement the new xl " Yi Sun
2017-10-20  8:28 ` [PATCH v9 13/16] tools: rename 'xc_psr_cat_type' to 'xc_psr_type' Yi Sun
2017-10-20  8:28 ` [PATCH v9 14/16] tools: implement new generic get value interface and MBA get value command Yi Sun
2017-10-20  8:28 ` [PATCH v9 15/16] tools: implement new generic set value interface and MBA set " Yi Sun
2017-12-18  8:31   ` [PATCH v9.1 " Yi Sun
2017-10-20  8:28 ` [PATCH v9 16/16] docs: add MBA description in docs Yi Sun
2017-12-05  2:53 ` [PATCH v9 00/16] Enable Memory Bandwidth Allocation in Xen Yi Sun
2017-12-05  9:09   ` Jan Beulich
2017-12-05  9:21     ` 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=1508488108-7071-11-git-send-email-yi.y.sun@linux.intel.com \
    --to=yi.y.sun@linux.intel.com \
    --cc=chao.p.peng@linux.intel.com \
    --cc=ian.jackson@eu.citrix.com \
    --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 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.