Skip to contentSkip to conversation

Provide mechanism to disable select RDT features & use for Skylake

PATCH New Luck, Tony 2 participants 7 messages Aug 24, 2017 – Aug 25, 2017

Subsystems (2)
lore
Share & tools
lore

Luck, Tony

author
#0 lore raw

cover Provide mechanism to disable select RDT features & use for Skylake

From: Tony Luck <[email protected]>

Some of the RDT features are affected by errata on Skylake. Make sure unsuspecting users do not accidentally use these.

To do this we add a CPU model quirk mechanism that disables the features affected by the errata by default. But also add a command line mechanism for users to turn them back on again for cases where the use case still works despite the issue.

First patch establishes the CPU quirk mechanism and uses it for the existing Haswell probe code.

Second sets up the command line arguments.

Last adds the code for Skylake model to disable features affected by errata.

Tony Luck (3):
x86/intel_rdt: Move special case code for Haswell to a quirk function x86/intel_rdt: Add command line options for resource director
technology
x86/intel_rdt: Turn off most RDT features on Skylake

 Documentation/admin-guide/kernel-parameters.rst |   1 +
 Documentation/admin-guide/kernel-parameters.txt |   6 +
 arch/x86/kernel/cpu/intel_rdt.c                 | 147 +++++++++++++++++++-----
 3 files changed, 123 insertions(+), 31 deletions(-)
Signature · 1 line
2.11.0
author
#1 lore raw

PATCH 1/3 x86/intel_rdt: Move special case code for Haswell to a quirk function

From: Tony Luck <[email protected]>

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

---
 arch/x86/kernel/cpu/intel_rdt.c | 52 ++++++++++++++++++++++-------------------
 1 file changed, 28 insertions(+), 24 deletions(-)
arch/x86/kernel/cpu/intel_rdt.c +28 -24
index 6935c8ecad7f..25514cd454b3 100644
@@ -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 = 0xc0000;
-		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 = 0xc0000;
+	r->cache.min_cbm_bits = 2;
+	r->alloc_capable = true;
+	r->alloc_enabled = true;
 
-	return false;
+	rdt_alloc_capable = true;
 }
 
 /*
@@ -647,7 +641,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))
@@ -689,8 +683,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();
 
Signature · 1 line
2.11.0
#2 lore raw

[tip:x86/cache] x86/intel_rdt: Move special case code for Haswell to a quirk function

x86/intel_rdt: Move special case code for Haswell to a quirk function
Commit-ID:  0576113a387e0c8a5d9e24b4cd62605d1c9c0db8
Gitweb:     http://git.kernel.org/tip/0576113a387e0c8a5d9e24b4cd62605d1c9c0db8
Author:     Tony Luck <[email protected]>
AuthorDate: Thu, 24 Aug 2017 09:26:50 -0700
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Fri, 25 Aug 2017 22:00:44 +0200

x86/intel_rdt: Move special case code for Haswell to a quirk function

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

---
 arch/x86/kernel/cpu/intel_rdt.c | 52 ++++++++++++++++++++++-------------------
 1 file changed, 28 insertions(+), 24 deletions(-)
arch/x86/kernel/cpu/intel_rdt.c +28 -24
index 6935c8e..25514cd 100644
@@ -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 = 0xc0000;
-		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 = 0xc0000;
+	r->cache.min_cbm_bits = 2;
+	r->alloc_capable = true;
+	r->alloc_enabled = true;
 
-	return false;
+	rdt_alloc_capable = true;
 }
 
 /*
@@ -647,7 +641,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))
@@ -689,8 +683,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();
 
author
#3 lore raw

PATCH 2/3 x86/intel_rdt: Add command line options for resource director technology

In reply to Luck, Tony

From: Tony Luck <[email protected]>

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).

---
 Documentation/admin-guide/kernel-parameters.rst |  1 +
 Documentation/admin-guide/kernel-parameters.txt |  6 ++
 arch/x86/kernel/cpu/intel_rdt.c                 | 94 ++++++++++++++++++++++---
 3 files changed, 93 insertions(+), 8 deletions(-)
Documentation/admin-guide/kernel-parameters.rst +1 -0
index d76ab3907e2b..b2598cc9834c 100644
@@ -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.
 	S390	S390 architecture is enabled.
 	SCSI	Appropriate SCSI support is enabled.
 			A lot of drivers have their options described inside
Documentation/admin-guide/kernel-parameters.txt +6 -0
index d9c171ce4190..ef52ae4ed6e8 100644
@@ -3598,6 +3598,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]] \
arch/x86/kernel/cpu/intel_rdt.c +86 -8

131 lines not on this page · raw message

Signature · 1 line
2.11.0
#4 lore raw

[tip:x86/cache] x86/intel_rdt: Add command line options for resource director technology

x86/intel_rdt: Add command line options for resource director technology
Commit-ID:  1d9807fc64c131a83a96917f2b2da1c9b00cf127
Gitweb:     http://git.kernel.org/tip/1d9807fc64c131a83a96917f2b2da1c9b00cf127
Author:     Tony Luck <[email protected]>
AuthorDate: Thu, 24 Aug 2017 09:26:51 -0700
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Fri, 25 Aug 2017 22:00:45 +0200

x86/intel_rdt: Add command line options for resource director technology

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 ]

---
 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(-)
Documentation/admin-guide/kernel-parameters.rst +1 -0
index d76ab39..b2598cc 100644
@@ -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.
 	S390	S390 architecture is enabled.
 	SCSI	Appropriate SCSI support is enabled.
 			A lot of drivers have their options described inside
Documentation/admin-guide/kernel-parameters.txt +6 -0
index d9c171c..ef52ae4 100644
@@ -3598,6 +3598,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]] \
arch/x86/kernel/cpu/intel_rdt.c +88 -8

133 lines not on this page · raw message

author
#5 lore raw

PATCH 3/3 x86/intel_rdt: Turn off most RDT features on Skylake

In reply to Luck, Tony

From: Tony Luck <[email protected]>

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.

---
 arch/x86/kernel/cpu/intel_rdt.c | 3 +++
 1 file changed, 3 insertions(+)
arch/x86/kernel/cpu/intel_rdt.c +3 -0
index 65222d8fd5ec..a55b74ca0973 100644
@@ -767,6 +767,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");
 	}
 }
 
Signature · 1 line
2.11.0
#6 lore raw

[tip:x86/cache] x86/intel_rdt: Turn off most RDT features on Skylake

x86/intel_rdt: Turn off most RDT features on Skylake
Commit-ID:  d56593eb5eda8f593db92927059697bbf89bc4b3
Gitweb:     http://git.kernel.org/tip/d56593eb5eda8f593db92927059697bbf89bc4b3
Author:     Tony Luck <[email protected]>
AuthorDate: Thu, 24 Aug 2017 09:26:52 -0700
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Fri, 25 Aug 2017 22:00:45 +0200

x86/intel_rdt: Turn off most RDT features on Skylake

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.

---
 arch/x86/kernel/cpu/intel_rdt.c | 3 +++
 1 file changed, 3 insertions(+)
arch/x86/kernel/cpu/intel_rdt.c +3 -0
index b641622..cd5fc61 100644
@@ -769,6 +769,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");
 	}
 }