[linux-yocto] [yocto-4.12][PATCH 3/3] x86/intel_rdt: Turn off most RDT features on Skylake

2018-01-08 Thread quanyang.wang
From: Tony Luck 

commit d56593eb5eda8f593db92927059697bbf89bc4b3 upstream

Errata list is included in this document:
https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/6th-gen-x-series-spec-update.pdf
with more details in:
https://www.intel.com/content/www/us/en/processors/xeon/scalable/xeon-scalable-spec-update.html

But the tl;dr summary (using tags from first of the documents) is:
SKZ4  MBM does not accurately track write bandwidth
SKZ17 CMT counters may not count accurately
SKZ18 CAT may not restrict cacheline allocation under certain conditions
SKZ19 MBM counters may undercount

Disable all these features on Skylake models. Users who understand the
errata may re-enable using boot command line options.

Signed-off-by: Tony Luck 
Cc: Fenghua" 
Cc: Ravi V" 
Cc: "Peter Zijlstra" 
Cc: "Stephane Eranian" 
Cc: "Andi Kleen" 
Cc: "David Carrillo-Cisneros" 
Cc: Vikas Shivappa 
Link: 
http://lkml.kernel.org/r/3aea0a3bae219062c812668bd9b7b8f1a25003ba.1503512900.git.tony.l...@intel.com
Signed-off-by: Thomas Gleixner 
---
 arch/x86/kernel/cpu/intel_rdt.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c
index f15c61d..88dcf84 100644
--- a/arch/x86/kernel/cpu/intel_rdt.c
+++ b/arch/x86/kernel/cpu/intel_rdt.c
@@ -770,6 +770,9 @@ static __init void rdt_quirks(void)
if (!rdt_options[RDT_FLAG_L3_CAT].force_off)
cache_alloc_hsw_probe();
break;
+   case INTEL_FAM6_SKYLAKE_X:
+   if (boot_cpu_data.x86_mask <= 4)
+   set_rdt_options("!cmt,!mbmtotal,!mbmlocal,!l3cat");
}
 }
 
-- 
1.9.1

-- 
___
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto


[linux-yocto] [yocto-4.12][PATCH 2/3] x86/intel_rdt: Add command line options for resource director technology

2018-01-08 Thread quanyang.wang
From: Tony Luck 

commit 1d9807fc64c131a83a96917f2b2da1c9b00cf127 upstream

Command line options allow us to ignore features that we don't want.
Also we can re-enable options that have been disabled on a platform
(so long as the underlying h/w actually supports the option).

[ tglx: Marked the option array __initdata and the helper function __init ]

Signed-off-by: Tony Luck 
Signed-off-by: Thomas Gleixner 
Cc: Fenghua" 
Cc: Ravi V" 
Cc: "Peter Zijlstra" 
Cc: "Stephane Eranian" 
Cc: "Andi Kleen" 
Cc: "David Carrillo-Cisneros" 
Cc: Vikas Shivappa 
Link: 
http://lkml.kernel.org/r/0c37b0d4dbc30977a3c1cee08b66420f83662694.1503512900.git.tony.l...@intel.com
---
 Documentation/admin-guide/kernel-parameters.rst |  1 +
 Documentation/admin-guide/kernel-parameters.txt |  6 ++
 arch/x86/kernel/cpu/intel_rdt.c | 96 ++---
 3 files changed, 95 insertions(+), 8 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.rst 
b/Documentation/admin-guide/kernel-parameters.rst
index d76ab39..b2598cc 100644
--- a/Documentation/admin-guide/kernel-parameters.rst
+++ b/Documentation/admin-guide/kernel-parameters.rst
@@ -138,6 +138,7 @@ parameter is applicable::
PPT Parallel port support is enabled.
PS2 Appropriate PS/2 support is enabled.
RAM RAM disk support is enabled.
+   RDT Intel Resource Director Technology.
S390S390 architecture is enabled.
SCSIAppropriate SCSI support is enabled.
A lot of drivers have their options described inside
diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index 7737ab5..19ccfcb 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3538,6 +3538,12 @@
Run specified binary instead of /init from the ramdisk,
used for early userspace startup. See initrd.
 
+   rdt=[HW,X86,RDT]
+   Turn on/off individual RDT features. List is:
+   cmt, mbmtotal, mbmlocal, l3cat, l3cdp, l2cat, mba.
+   E.g. to turn on cmt and turn off mba use:
+   rdt=cmt,!mba
+
reboot= [KNL]
Format (x86 or x86_64):
[w[arm] | c[old] | h[ard] | s[oft] | g[pio]] \
diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c
index 5af2f8f..f15c61d 100644
--- a/arch/x86/kernel/cpu/intel_rdt.c
+++ b/arch/x86/kernel/cpu/intel_rdt.c
@@ -638,6 +638,85 @@ static __init void rdt_init_padding(void)
}
 }
 
+enum {
+   RDT_FLAG_CMT,
+   RDT_FLAG_MBM_TOTAL,
+   RDT_FLAG_MBM_LOCAL,
+   RDT_FLAG_L3_CAT,
+   RDT_FLAG_L3_CDP,
+   RDT_FLAG_L2_CAT,
+   RDT_FLAG_MBA,
+};
+
+#define RDT_OPT(idx, n, f) \
+[idx] = {  \
+   .name = n,  \
+   .flag = f   \
+}
+
+struct rdt_options {
+   char*name;
+   int flag;
+   boolforce_off, force_on;
+};
+
+static struct rdt_options rdt_options[]  __initdata = {
+   RDT_OPT(RDT_FLAG_CMT,   "cmt",  X86_FEATURE_CQM_OCCUP_LLC),
+   RDT_OPT(RDT_FLAG_MBM_TOTAL, "mbmtotal", X86_FEATURE_CQM_MBM_TOTAL),
+   RDT_OPT(RDT_FLAG_MBM_LOCAL, "mbmlocal", X86_FEATURE_CQM_MBM_LOCAL),
+   RDT_OPT(RDT_FLAG_L3_CAT,"l3cat",X86_FEATURE_CAT_L3),
+   RDT_OPT(RDT_FLAG_L3_CDP,"l3cdp",X86_FEATURE_CDP_L3),
+   RDT_OPT(RDT_FLAG_L2_CAT,"l2cat",X86_FEATURE_CAT_L2),
+   RDT_OPT(RDT_FLAG_MBA,   "mba",  X86_FEATURE_MBA),
+};
+#define NUM_RDT_OPTIONS ARRAY_SIZE(rdt_options)
+
+static int __init set_rdt_options(char *str)
+{
+   struct rdt_options *o;
+   bool force_off;
+   char *tok;
+
+   if (*str == '=')
+   str++;
+   while ((tok = strsep(&str, ",")) != NULL) {
+   force_off = *tok == '!';
+   if (force_off)
+   tok++;
+   for (o = rdt_options; o < &rdt_options[NUM_RDT_OPTIONS]; o++) {
+   if (strcmp(tok, o->name) == 0) {
+   if (force_off)
+   o->force_off = true;
+   else
+   o->force_on = true;
+   break;
+   }
+   }
+   }
+   return 1;
+}
+__setup("rdt", set_rdt_options);
+
+static bool __init rdt_cpu_has(int flag)
+{
+   bool ret = boot_cpu_has(flag);
+   struct rdt_options *o;
+
+   if (!ret)
+   return ret;
+
+   for (o = rdt_options; o < &rdt_options[NUM_RDT_OPTIONS]; o++) {
+   if (flag == o->flag) {
+   if (o->force_off)
+   ret = false;
+   if (o->force_on)

[linux-yocto] [yocto-4.12][PATCH 1/3] x86/intel_rdt: Move special case code for Haswell to a quirk function

2018-01-08 Thread quanyang.wang
From: Tony Luck 

commit 0576113a387e0c8a5d9e24b4cd62605d1c9c0db8 upstream

No functional change, but lay the ground work for other per-model
quirks.

Signed-off-by: Tony Luck 
Signed-off-by: Thomas Gleixner 
Cc: Fenghua" 
Cc: Ravi V" 
Cc: "Peter Zijlstra" 
Cc: "Stephane Eranian" 
Cc: "Andi Kleen" 
Cc: "David Carrillo-Cisneros" 
Cc: Vikas Shivappa 
Link: 
http://lkml.kernel.org/r/f195a83751b5f8b1d8a78bd3c1914300c8fa3142.1503512900.git.tony.l...@intel.com
---
 arch/x86/kernel/cpu/intel_rdt.c | 52 ++---
 1 file changed, 28 insertions(+), 24 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c
index dfc7c48..5af2f8f 100644
--- a/arch/x86/kernel/cpu/intel_rdt.c
+++ b/arch/x86/kernel/cpu/intel_rdt.c
@@ -172,34 +172,28 @@ static unsigned int cbm_idx(struct rdt_resource *r, 
unsigned int closid)
  * is always 20 on hsw server parts. The minimum cache bitmask length
  * allowed for HSW server is always 2 bits. Hardcode all of them.
  */
-static inline bool cache_alloc_hsw_probe(void)
+static inline void cache_alloc_hsw_probe(void)
 {
-   if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
-   boot_cpu_data.x86 == 6 &&
-   boot_cpu_data.x86_model == INTEL_FAM6_HASWELL_X) {
-   struct rdt_resource *r  = &rdt_resources_all[RDT_RESOURCE_L3];
-   u32 l, h, max_cbm = BIT_MASK(20) - 1;
+   struct rdt_resource *r  = &rdt_resources_all[RDT_RESOURCE_L3];
+   u32 l, h, max_cbm = BIT_MASK(20) - 1;
 
-   if (wrmsr_safe(IA32_L3_CBM_BASE, max_cbm, 0))
-   return false;
-   rdmsr(IA32_L3_CBM_BASE, l, h);
-
-   /* If all the bits were set in MSR, return success */
-   if (l != max_cbm)
-   return false;
+   if (wrmsr_safe(IA32_L3_CBM_BASE, max_cbm, 0))
+   return;
+   rdmsr(IA32_L3_CBM_BASE, l, h);
 
-   r->num_closid = 4;
-   r->default_ctrl = max_cbm;
-   r->cache.cbm_len = 20;
-   r->cache.shareable_bits = 0xc;
-   r->cache.min_cbm_bits = 2;
-   r->alloc_capable = true;
-   r->alloc_enabled = true;
+   /* If all the bits were set in MSR, return success */
+   if (l != max_cbm)
+   return;
 
-   return true;
-   }
+   r->num_closid = 4;
+   r->default_ctrl = max_cbm;
+   r->cache.cbm_len = 20;
+   r->cache.shareable_bits = 0xc;
+   r->cache.min_cbm_bits = 2;
+   r->alloc_capable = true;
+   r->alloc_enabled = true;
 
-   return false;
+   rdt_alloc_capable = true;
 }
 
 /*
@@ -648,7 +642,7 @@ static __init bool get_rdt_alloc_resources(void)
 {
bool ret = false;
 
-   if (cache_alloc_hsw_probe())
+   if (rdt_alloc_capable)
return true;
 
if (!boot_cpu_has(X86_FEATURE_RDT_A))
@@ -690,8 +684,18 @@ static __init bool get_rdt_mon_resources(void)
return !rdt_get_mon_l3_config(&rdt_resources_all[RDT_RESOURCE_L3]);
 }
 
+static __init void rdt_quirks(void)
+{
+   switch (boot_cpu_data.x86_model) {
+   case INTEL_FAM6_HASWELL_X:
+   cache_alloc_hsw_probe();
+   break;
+   }
+}
+
 static __init bool get_rdt_resources(void)
 {
+   rdt_quirks();
rdt_alloc_capable = get_rdt_alloc_resources();
rdt_mon_capable = get_rdt_mon_resources();
 
-- 
1.9.1

-- 
___
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto