aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinette Chatre <reinette.chatre@intel.com>2018-09-15 17:58:20 -0400
committerThomas Gleixner <tglx@linutronix.de>2018-09-18 17:38:05 -0400
commitf968dc119a159a95628a20de2a2dcc913d0a82d7 (patch)
treece739143e31e50b2ac03f46d9b535e86e9e24dfb
parent753694a8df318f204a0ac1303de136def16f2e9c (diff)
x86/intel_rdt: Fix size reporting of MBA resource
Chen Yu reported a divide-by-zero error when accessing the 'size' resctrl file when a MBA resource is enabled. divide error: 0000 [#1] SMP PTI CPU: 93 PID: 1929 Comm: cat Not tainted 4.19.0-rc2-debug-rdt+ #25 RIP: 0010:rdtgroup_cbm_to_size+0x7e/0xa0 Call Trace: rdtgroup_size_show+0x11a/0x1d0 seq_read+0xd8/0x3b0 Quoting Chen Yu's report: This is because for MB resource, the r->cache.cbm_len is zero, thus calculating size in rdtgroup_cbm_to_size() will trigger the exception. Fix this issue in the 'size' file by getting correct memory bandwidth value which is in MBps when MBA software controller is enabled or in percentage when MBA software controller is disabled. Fixes: d9b48c86eb38 ("x86/intel_rdt: Display resource groups' allocations in bytes") Reported-by: Chen Yu <yu.c.chen@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Chen Yu <yu.c.chen@intel.com> Cc: "H Peter Anvin" <hpa@zytor.com> Cc: "Tony Luck" <tony.luck@intel.com> Cc: "Xiaochen Shen" <xiaochen.shen@intel.com> Link: https://lkml.kernel.org/r/20180904174614.26682-1-yu.c.chen@intel.com Link: https://lkml.kernel.org/r/1537048707-76280-3-git-send-email-fenghua.yu@intel.com
-rw-r--r--arch/x86/kernel/cpu/intel_rdt_rdtgroup.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
index b799c00bef09..32e8bbdf2400 100644
--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
@@ -1155,8 +1155,8 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
1155 struct rdt_resource *r; 1155 struct rdt_resource *r;
1156 struct rdt_domain *d; 1156 struct rdt_domain *d;
1157 unsigned int size; 1157 unsigned int size;
1158 bool sep = false; 1158 bool sep;
1159 u32 cbm; 1159 u32 ctrl;
1160 1160
1161 rdtgrp = rdtgroup_kn_lock_live(of->kn); 1161 rdtgrp = rdtgroup_kn_lock_live(of->kn);
1162 if (!rdtgrp) { 1162 if (!rdtgrp) {
@@ -1174,6 +1174,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
1174 } 1174 }
1175 1175
1176 for_each_alloc_enabled_rdt_resource(r) { 1176 for_each_alloc_enabled_rdt_resource(r) {
1177 sep = false;
1177 seq_printf(s, "%*s:", max_name_width, r->name); 1178 seq_printf(s, "%*s:", max_name_width, r->name);
1178 list_for_each_entry(d, &r->domains, list) { 1179 list_for_each_entry(d, &r->domains, list) {
1179 if (sep) 1180 if (sep)
@@ -1181,8 +1182,13 @@ static int rdtgroup_size_show(struct kernfs_open_file *of,
1181 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) { 1182 if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP) {
1182 size = 0; 1183 size = 0;
1183 } else { 1184 } else {
1184 cbm = d->ctrl_val[rdtgrp->closid]; 1185 ctrl = (!is_mba_sc(r) ?
1185 size = rdtgroup_cbm_to_size(r, d, cbm); 1186 d->ctrl_val[rdtgrp->closid] :
1187 d->mbps_val[rdtgrp->closid]);
1188 if (r->rid == RDT_RESOURCE_MBA)
1189 size = ctrl;
1190 else
1191 size = rdtgroup_cbm_to_size(r, d, ctrl);
1186 } 1192 }
1187 seq_printf(s, "%d=%u", d->id, size); 1193 seq_printf(s, "%d=%u", d->id, size);
1188 sep = true; 1194 sep = true;