Commit 90413464 authored by Stephane Eranian's avatar Stephane Eranian Committed by Ingo Molnar

perf/x86: Vectorize cpuc->kfree_on_online

Make the cpuc->kfree_on_online a vector to accommodate
more than one entry and add the second entry to be
used by a later patch.
Signed-off-by: default avatarStephane Eranian <eranian@google.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarMaria Dimakopoulou <maria.n.dimakopoulou@gmail.com>
Cc: bp@alien8.de
Cc: jolsa@redhat.com
Cc: kan.liang@intel.com
Link: http://lkml.kernel.org/r/1416251225-17721-3-git-send-email-eranian@google.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 9a5e3fb5
...@@ -1373,11 +1373,12 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) ...@@ -1373,11 +1373,12 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
{ {
unsigned int cpu = (long)hcpu; unsigned int cpu = (long)hcpu;
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu); struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
int ret = NOTIFY_OK; int i, ret = NOTIFY_OK;
switch (action & ~CPU_TASKS_FROZEN) { switch (action & ~CPU_TASKS_FROZEN) {
case CPU_UP_PREPARE: case CPU_UP_PREPARE:
cpuc->kfree_on_online = NULL; for (i = 0 ; i < X86_PERF_KFREE_MAX; i++)
cpuc->kfree_on_online[i] = NULL;
if (x86_pmu.cpu_prepare) if (x86_pmu.cpu_prepare)
ret = x86_pmu.cpu_prepare(cpu); ret = x86_pmu.cpu_prepare(cpu);
break; break;
...@@ -1388,7 +1389,10 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) ...@@ -1388,7 +1389,10 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
break; break;
case CPU_ONLINE: case CPU_ONLINE:
kfree(cpuc->kfree_on_online); for (i = 0 ; i < X86_PERF_KFREE_MAX; i++) {
kfree(cpuc->kfree_on_online[i]);
cpuc->kfree_on_online[i] = NULL;
}
break; break;
case CPU_DYING: case CPU_DYING:
......
...@@ -125,6 +125,12 @@ struct intel_shared_regs { ...@@ -125,6 +125,12 @@ struct intel_shared_regs {
#define MAX_LBR_ENTRIES 16 #define MAX_LBR_ENTRIES 16
enum {
X86_PERF_KFREE_SHARED = 0,
X86_PERF_KFREE_EXCL = 1,
X86_PERF_KFREE_MAX
};
struct cpu_hw_events { struct cpu_hw_events {
/* /*
* Generic x86 PMC bits * Generic x86 PMC bits
...@@ -187,7 +193,7 @@ struct cpu_hw_events { ...@@ -187,7 +193,7 @@ struct cpu_hw_events {
/* Inverted mask of bits to clear in the perf_ctr ctrl registers */ /* Inverted mask of bits to clear in the perf_ctr ctrl registers */
u64 perf_ctr_virt_mask; u64 perf_ctr_virt_mask;
void *kfree_on_online; void *kfree_on_online[X86_PERF_KFREE_MAX];
}; };
#define __EVENT_CONSTRAINT(c, n, m, w, o, f) {\ #define __EVENT_CONSTRAINT(c, n, m, w, o, f) {\
......
...@@ -382,6 +382,7 @@ static int amd_pmu_cpu_prepare(int cpu) ...@@ -382,6 +382,7 @@ static int amd_pmu_cpu_prepare(int cpu)
static void amd_pmu_cpu_starting(int cpu) static void amd_pmu_cpu_starting(int cpu)
{ {
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu); struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
void **onln = &cpuc->kfree_on_online[X86_PERF_KFREE_SHARED];
struct amd_nb *nb; struct amd_nb *nb;
int i, nb_id; int i, nb_id;
...@@ -399,7 +400,7 @@ static void amd_pmu_cpu_starting(int cpu) ...@@ -399,7 +400,7 @@ static void amd_pmu_cpu_starting(int cpu)
continue; continue;
if (nb->nb_id == nb_id) { if (nb->nb_id == nb_id) {
cpuc->kfree_on_online = cpuc->amd_nb; *onln = cpuc->amd_nb;
cpuc->amd_nb = nb; cpuc->amd_nb = nb;
break; break;
} }
......
...@@ -2251,12 +2251,14 @@ static void intel_pmu_cpu_starting(int cpu) ...@@ -2251,12 +2251,14 @@ static void intel_pmu_cpu_starting(int cpu)
return; return;
if (!(x86_pmu.flags & PMU_FL_NO_HT_SHARING)) { if (!(x86_pmu.flags & PMU_FL_NO_HT_SHARING)) {
void **onln = &cpuc->kfree_on_online[X86_PERF_KFREE_SHARED];
for_each_cpu(i, topology_thread_cpumask(cpu)) { for_each_cpu(i, topology_thread_cpumask(cpu)) {
struct intel_shared_regs *pc; struct intel_shared_regs *pc;
pc = per_cpu(cpu_hw_events, i).shared_regs; pc = per_cpu(cpu_hw_events, i).shared_regs;
if (pc && pc->core_id == core_id) { if (pc && pc->core_id == core_id) {
cpuc->kfree_on_online = cpuc->shared_regs; *onln = cpuc->shared_regs;
cpuc->shared_regs = pc; cpuc->shared_regs = pc;
break; break;
} }
......
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