Commit 47820e73 authored by Xiaochen Shen's avatar Xiaochen Shen Committed by Borislav Petkov

x86/resctrl: Initialize a new resource group with default MBA values

Currently, when a new resource group is created, the allocation values
of the MBA resource are not initialized and remain meaningless data.

For example:

  mkdir /sys/fs/resctrl/p1
  cat /sys/fs/resctrl/p1/schemata
  MB:0=100;1=100

  echo "MB:0=10;1=20" > /sys/fs/resctrl/p1/schemata
  cat /sys/fs/resctrl/p1/schemata
  MB:0= 10;1= 20

  rmdir /sys/fs/resctrl/p1
  mkdir /sys/fs/resctrl/p2
  cat /sys/fs/resctrl/p2/schemata
  MB:0= 10;1= 20

Therefore, when the new group is created, it is reasonable to initialize
MBA resource with default values.

Initialize the MBA resource and cache resources in separate functions.

 [ bp: Add newlines between code blocks for better readability. ]
Signed-off-by: default avatarXiaochen Shen <xiaochen.shen@intel.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Reviewed-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: pei.p.jia@intel.com
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/1555499329-1170-3-git-send-email-xiaochen.shen@intel.com
parent 7390619a
...@@ -342,10 +342,10 @@ int update_domains(struct rdt_resource *r, int closid) ...@@ -342,10 +342,10 @@ int update_domains(struct rdt_resource *r, int closid)
if (cpumask_empty(cpu_mask) || mba_sc) if (cpumask_empty(cpu_mask) || mba_sc)
goto done; goto done;
cpu = get_cpu(); cpu = get_cpu();
/* Update CBM on this cpu if it's in cpu_mask. */ /* Update resource control msr on this CPU if it's in cpu_mask. */
if (cpumask_test_cpu(cpu, cpu_mask)) if (cpumask_test_cpu(cpu, cpu_mask))
rdt_ctrl_update(&msr_param); rdt_ctrl_update(&msr_param);
/* Update CBM on other cpus. */ /* Update resource control msr on other CPUs. */
smp_call_function_many(cpu_mask, rdt_ctrl_update, &msr_param, 1); smp_call_function_many(cpu_mask, rdt_ctrl_update, &msr_param, 1);
put_cpu(); put_cpu();
......
...@@ -2581,8 +2581,8 @@ static int __init_one_rdt_domain(struct rdt_domain *d, struct rdt_resource *r, ...@@ -2581,8 +2581,8 @@ static int __init_one_rdt_domain(struct rdt_domain *d, struct rdt_resource *r,
return 0; return 0;
} }
/** /*
* rdtgroup_init_alloc - Initialize the new RDT group's allocations * Initialize cache resources with default values.
* *
* A new RDT group is being created on an allocation capable (CAT) * A new RDT group is being created on an allocation capable (CAT)
* supporting system. Set this group up to start off with all usable * supporting system. Set this group up to start off with all usable
...@@ -2591,38 +2591,52 @@ static int __init_one_rdt_domain(struct rdt_domain *d, struct rdt_resource *r, ...@@ -2591,38 +2591,52 @@ static int __init_one_rdt_domain(struct rdt_domain *d, struct rdt_resource *r,
* If there are no more shareable bits available on any domain then * If there are no more shareable bits available on any domain then
* the entire allocation will fail. * the entire allocation will fail.
*/ */
static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp) static int rdtgroup_init_cat(struct rdt_resource *r, u32 closid)
{ {
struct rdt_resource *r;
struct rdt_domain *d; struct rdt_domain *d;
int ret; int ret;
for_each_alloc_enabled_rdt_resource(r) {
/*
* Only initialize default allocations for CBM cache
* resources
*/
if (r->rid == RDT_RESOURCE_MBA)
continue;
list_for_each_entry(d, &r->domains, list) { list_for_each_entry(d, &r->domains, list) {
ret = __init_one_rdt_domain(d, r, rdtgrp->closid); ret = __init_one_rdt_domain(d, r, closid);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
return 0;
}
/* Initialize MBA resource with default values. */
static void rdtgroup_init_mba(struct rdt_resource *r)
{
struct rdt_domain *d;
list_for_each_entry(d, &r->domains, list) {
d->new_ctrl = is_mba_sc(r) ? MBA_MAX_MBPS : r->default_ctrl;
d->have_new_ctrl = true;
} }
}
/* Initialize the RDT group's allocations. */
static int rdtgroup_init_alloc(struct rdtgroup *rdtgrp)
{
struct rdt_resource *r;
int ret;
for_each_alloc_enabled_rdt_resource(r) { for_each_alloc_enabled_rdt_resource(r) {
/* if (r->rid == RDT_RESOURCE_MBA) {
* Only initialize default allocations for CBM cache rdtgroup_init_mba(r);
* resources } else {
*/ ret = rdtgroup_init_cat(r, rdtgrp->closid);
if (r->rid == RDT_RESOURCE_MBA) if (ret < 0)
continue; return ret;
}
ret = update_domains(r, rdtgrp->closid); ret = update_domains(r, rdtgrp->closid);
if (ret < 0) { if (ret < 0) {
rdt_last_cmd_puts("Failed to initialize allocations\n"); rdt_last_cmd_puts("Failed to initialize allocations\n");
return ret; return ret;
} }
} }
rdtgrp->mode = RDT_MODE_SHAREABLE; rdtgrp->mode = RDT_MODE_SHAREABLE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment