diff options
author | Tony Luck <tony.luck@intel.com> | 2017-07-25 23:14:45 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-08-01 22:41:28 +0200 |
commit | 9f52425ba303d91c8370719e91d7e578bfdf309f (patch) | |
tree | cfd5e19f66e8da55111ce8b390a5beac2d7924a7 /arch/x86/kernel/cpu/intel_rdt.c | |
parent | x86/intel_rdt/cqm: Add CPU hotplug support (diff) | |
download | linux-9f52425ba303d91c8370719e91d7e578bfdf309f.tar.xz linux-9f52425ba303d91c8370719e91d7e578bfdf309f.zip |
x86/intel_rdt/mbm: Basic counting of MBM events (total and local)
Check CPUID bits for whether each of the MBM events is supported.
Allocate space for each RMID for each counter in each domain to save
previous MSR counter value and running total of data.
Create files in each of the monitor directories.
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Vikas Shivappa <vikas.shivappa@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: ravi.v.shankar@intel.com
Cc: fenghua.yu@intel.com
Cc: peterz@infradead.org
Cc: eranian@google.com
Cc: vikas.shivappa@intel.com
Cc: ak@linux.intel.com
Cc: davidcc@google.com
Cc: reinette.chatre@intel.com
Link: http://lkml.kernel.org/r/1501017287-28083-27-git-send-email-vikas.shivappa@linux.intel.com
Diffstat (limited to 'arch/x86/kernel/cpu/intel_rdt.c')
-rw-r--r-- | arch/x86/kernel/cpu/intel_rdt.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c index f12bb91b8c66..4c17a7060dfd 100644 --- a/arch/x86/kernel/cpu/intel_rdt.c +++ b/arch/x86/kernel/cpu/intel_rdt.c @@ -420,6 +420,8 @@ static int domain_setup_ctrlval(struct rdt_resource *r, struct rdt_domain *d) static int domain_setup_mon_state(struct rdt_resource *r, struct rdt_domain *d) { + size_t tsize; + if (is_llc_occupancy_enabled()) { d->rmid_busy_llc = kcalloc(BITS_TO_LONGS(r->num_rmid), sizeof(unsigned long), @@ -427,6 +429,23 @@ static int domain_setup_mon_state(struct rdt_resource *r, struct rdt_domain *d) if (!d->rmid_busy_llc) return -ENOMEM; } + if (is_mbm_total_enabled()) { + tsize = sizeof(*d->mbm_total); + d->mbm_total = kcalloc(r->num_rmid, tsize, GFP_KERNEL); + if (!d->mbm_total) { + kfree(d->rmid_busy_llc); + return -ENOMEM; + } + } + if (is_mbm_local_enabled()) { + tsize = sizeof(*d->mbm_local); + d->mbm_local = kcalloc(r->num_rmid, tsize, GFP_KERNEL); + if (!d->mbm_local) { + kfree(d->rmid_busy_llc); + kfree(d->mbm_total); + return -ENOMEM; + } + } return 0; } @@ -466,6 +485,7 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r) return; d->id = id; + cpumask_set_cpu(cpu, &d->cpu_mask); if (r->alloc_capable && domain_setup_ctrlval(r, d)) { kfree(d); @@ -477,7 +497,6 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r) return; } - cpumask_set_cpu(cpu, &d->cpu_mask); list_add_tail(&d->list, add_pos); /* @@ -509,6 +528,8 @@ static void domain_remove_cpu(int cpu, struct rdt_resource *r) rmdir_mondata_subdir_allrdtgrp(r, d->id); kfree(d->ctrl_val); kfree(d->rmid_busy_llc); + kfree(d->mbm_total); + kfree(d->mbm_local); list_del(&d->list); kfree(d); } |