diff options
author | Vikas Shivappa <vikas.shivappa@linux.intel.com> | 2017-07-25 14:14:47 -0700 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-08-01 22:41:29 +0200 |
commit | e33026831bdb5f051499fec6a606f79fe1f94cc8 (patch) | |
tree | 2a9b2e4425592ce74cb9a04cc1bdd8043d940838 /arch/x86/kernel/cpu/intel_rdt.c | |
parent | a4de1dfdd726537e2a78b55759fc646d9b0a0be8 (diff) | |
download | linux-e33026831bdb5f051499fec6a606f79fe1f94cc8.tar.gz linux-e33026831bdb5f051499fec6a606f79fe1f94cc8.tar.bz2 linux-e33026831bdb5f051499fec6a606f79fe1f94cc8.zip |
x86/intel_rdt/mbm: Handle counter overflow
Set up a delayed work queue for each domain that will read all
the MBM counters of active RMIDs once per second to make sure
that they don't wrap around between reads from users.
[Tony: Added the initializations for the work structure and completed
the patch]
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-29-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 | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c index 4c17a7060dfd..de26aa7971d4 100644 --- a/arch/x86/kernel/cpu/intel_rdt.c +++ b/arch/x86/kernel/cpu/intel_rdt.c @@ -348,12 +348,10 @@ void rdt_ctrl_update(void *arg) int cpu = smp_processor_id(); struct rdt_domain *d; - list_for_each_entry(d, &r->domains, list) { - /* Find the domain that contains this CPU */ - if (cpumask_test_cpu(cpu, &d->cpu_mask)) { - r->msr_update(d, m, r); - return; - } + d = get_domain_from_cpu(cpu, r); + if (d) { + r->msr_update(d, m, r); + return; } pr_warn_once("cpu %d not found in any domain for resource %s\n", cpu, r->name); @@ -447,6 +445,11 @@ static int domain_setup_mon_state(struct rdt_resource *r, struct rdt_domain *d) } } + if (is_mbm_enabled()) { + INIT_DELAYED_WORK(&d->mbm_over, mbm_handle_overflow); + mbm_setup_overflow_handler(d); + } + return 0; } @@ -531,7 +534,13 @@ static void domain_remove_cpu(int cpu, struct rdt_resource *r) kfree(d->mbm_total); kfree(d->mbm_local); list_del(&d->list); + if (is_mbm_enabled()) + cancel_delayed_work(&d->mbm_over); kfree(d); + } else if (r == &rdt_resources_all[RDT_RESOURCE_L3] && + cpu == d->mbm_work_cpu && is_mbm_enabled()) { + cancel_delayed_work(&d->mbm_over); + mbm_setup_overflow_handler(d); } } |