diff mbox

[v11,14/23] x86: refactor psr: CDP: implement get hw info flow.

Message ID 1493801063-38513-15-git-send-email-yi.y.sun@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yi Sun May 3, 2017, 8:44 a.m. UTC
This patch implements get HW info flow for CDP including L3 CDP callback
function. The flow is almost same as L3 CAT.

With this patch, 'psr-hwinfo' can work for L3 CDP.

Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
---
v11:
    - modify 'psr_get_info' flow to make it simple to cover CDP case.
v10:
    - update renamed macros used by psr_get_info.
      (suggested by Jan Beulich)
    - change 'psr_get_info' flow to cover CDP case to make codes in sysctl
      more simple.
      (suggested by Jan Beulich)
    - remove sysctl redundant codes after applying above changes.
      (suggested by Jan Beulich)
v9:
    - modify commit message to explain flow more clearly.
    - reuse 'cat_get_feat_info' for CDP to reduce redundant codes.
      (suggested by Roger Pau)
    - fix coding style issues.
      (suggested by Wei Liu and Roger Pau)
    - rename macros used by psr_get_info to make them meaningful.
      (suggested by Jan Beulich)
v5:
    - rename 'dat[]' to 'data[]'.
      (suggested by Jan Beulich)
    - remove type check in callback function.
      (suggested by Jan Beulich)
v4:
    - create this patch to make codes easier to understand.
      (suggested by Jan Beulich)
---
 xen/arch/x86/psr.c | 31 ++++++++++++++++++++++++++++---
 1 file changed, 28 insertions(+), 3 deletions(-)

Comments

Jan Beulich May 31, 2017, 9:40 a.m. UTC | #1
>>> On 03.05.17 at 10:44, <yi.y.sun@linux.intel.com> wrote:
> --- a/xen/arch/x86/psr.c
> +++ b/xen/arch/x86/psr.c
> @@ -207,7 +207,9 @@ static void free_socket_resources(unsigned int socket)
>      memset(info->dom_ids, 0, ((DOMID_IDLE + 1) + 7) / 8);
>  }
>  
> -static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
> +static enum psr_feat_type psr_cbm_type_to_feat_type(
> +                                    const struct psr_socket_info *info,
> +                                    enum cbm_type type)

Couldn't you avoid adding this new parameter by checking ...

> @@ -215,7 +217,18 @@ static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
>      {
>      case PSR_CBM_TYPE_L3:
>          feat_type = PSR_SOCKET_L3_CAT;
> +
> +        /* If type is L3 CAT but we cannot find it in feature array, try CDP. */
> +        if ( !info->features[feat_type] )

... the props array entry here?

Jan
Yi Sun June 5, 2017, 8:09 a.m. UTC | #2
On 17-05-31 03:40:40, Jan Beulich wrote:
> >>> On 03.05.17 at 10:44, <yi.y.sun@linux.intel.com> wrote:
> > --- a/xen/arch/x86/psr.c
> > +++ b/xen/arch/x86/psr.c
> > @@ -207,7 +207,9 @@ static void free_socket_resources(unsigned int socket)
> >      memset(info->dom_ids, 0, ((DOMID_IDLE + 1) + 7) / 8);
> >  }
> >  
> > -static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
> > +static enum psr_feat_type psr_cbm_type_to_feat_type(
> > +                                    const struct psr_socket_info *info,
> > +                                    enum cbm_type type)
> 
> Couldn't you avoid adding this new parameter by checking ...
> 
> > @@ -215,7 +217,18 @@ static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
> >      {
> >      case PSR_CBM_TYPE_L3:
> >          feat_type = PSR_SOCKET_L3_CAT;
> > +
> > +        /* If type is L3 CAT but we cannot find it in feature array, try CDP. */
> > +        if ( !info->features[feat_type] )
> 
> ... the props array entry here?
> 
Sure, thanks!

> Jan
diff mbox

Patch

diff --git a/xen/arch/x86/psr.c b/xen/arch/x86/psr.c
index 7000d95..55ac221 100644
--- a/xen/arch/x86/psr.c
+++ b/xen/arch/x86/psr.c
@@ -207,7 +207,9 @@  static void free_socket_resources(unsigned int socket)
     memset(info->dom_ids, 0, ((DOMID_IDLE + 1) + 7) / 8);
 }
 
-static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
+static enum psr_feat_type psr_cbm_type_to_feat_type(
+                                    const struct psr_socket_info *info,
+                                    enum cbm_type type)
 {
     enum psr_feat_type feat_type = PSR_SOCKET_FEAT_UNKNOWN;
 
@@ -215,7 +217,18 @@  static enum psr_feat_type psr_cbm_type_to_feat_type(enum cbm_type type)
     {
     case PSR_CBM_TYPE_L3:
         feat_type = PSR_SOCKET_L3_CAT;
+
+        /* If type is L3 CAT but we cannot find it in feature array, try CDP. */
+        if ( !info->features[feat_type] )
+            feat_type = PSR_SOCKET_L3_CDP;
+
+        break;
+
+    case PSR_CBM_TYPE_L3_DATA:
+    case PSR_CBM_TYPE_L3_CODE:
+        feat_type = PSR_SOCKET_L3_CDP;
         break;
+
     default:
         ASSERT_UNREACHABLE();
     }
@@ -328,8 +341,20 @@  static struct feat_props l3_cat_props = {
 };
 
 /* L3 CDP props */
+static bool l3_cdp_get_feat_info(const struct feat_node *feat,
+                                 uint32_t data[], uint32_t array_len)
+{
+    if ( !cat_get_feat_info(feat, data, array_len) )
+        return false;
+
+    data[PSR_INFO_IDX_CAT_FLAG] |= XEN_SYSCTL_PSR_CAT_L3_CDP;
+
+    return true;
+}
+
 static struct feat_props l3_cdp_props = {
     .cos_num = 2,
+    .get_feat_info = l3_cdp_get_feat_info,
 };
 
 static void __init parse_psr_bool(char *s, char *value, char *feature,
@@ -574,7 +599,7 @@  static struct feat_node *psr_get_feat_and_type(unsigned int socket,
     if ( IS_ERR(info) )
         return ERR_PTR(PTR_ERR(info));
 
-    *feat_type = psr_cbm_type_to_feat_type(type);
+    *feat_type = psr_cbm_type_to_feat_type(info, type);
     if ( *feat_type >= ARRAY_SIZE(info->features) )
         return NULL;
 
@@ -1040,7 +1065,7 @@  int psr_set_val(struct domain *d, unsigned int socket,
 
     val = new_val;
 
-    feat_type = psr_cbm_type_to_feat_type(type);
+    feat_type = psr_cbm_type_to_feat_type(info, type);
     if ( feat_type >= ARRAY_SIZE(info->features) ||
          !info->features[feat_type] )
         return -ENOENT;