mirror of https://gitee.com/openkylin/linux.git
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: Stephane Eranian <eranian@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Maria 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.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
9a5e3fb52a
commit
9041346431
|
@ -1373,11 +1373,12 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
|
|||
{
|
||||
unsigned int cpu = (long)hcpu;
|
||||
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) {
|
||||
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)
|
||||
ret = x86_pmu.cpu_prepare(cpu);
|
||||
break;
|
||||
|
@ -1388,7 +1389,10 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
|
|||
break;
|
||||
|
||||
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;
|
||||
|
||||
case CPU_DYING:
|
||||
|
|
|
@ -125,6 +125,12 @@ struct intel_shared_regs {
|
|||
|
||||
#define MAX_LBR_ENTRIES 16
|
||||
|
||||
enum {
|
||||
X86_PERF_KFREE_SHARED = 0,
|
||||
X86_PERF_KFREE_EXCL = 1,
|
||||
X86_PERF_KFREE_MAX
|
||||
};
|
||||
|
||||
struct cpu_hw_events {
|
||||
/*
|
||||
* Generic x86 PMC bits
|
||||
|
@ -187,7 +193,7 @@ struct cpu_hw_events {
|
|||
/* Inverted mask of bits to clear in the perf_ctr ctrl registers */
|
||||
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) {\
|
||||
|
|
|
@ -382,6 +382,7 @@ static int amd_pmu_cpu_prepare(int cpu)
|
|||
static void amd_pmu_cpu_starting(int 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;
|
||||
int i, nb_id;
|
||||
|
||||
|
@ -399,7 +400,7 @@ static void amd_pmu_cpu_starting(int cpu)
|
|||
continue;
|
||||
|
||||
if (nb->nb_id == nb_id) {
|
||||
cpuc->kfree_on_online = cpuc->amd_nb;
|
||||
*onln = cpuc->amd_nb;
|
||||
cpuc->amd_nb = nb;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -2251,12 +2251,14 @@ static void intel_pmu_cpu_starting(int cpu)
|
|||
return;
|
||||
|
||||
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)) {
|
||||
struct intel_shared_regs *pc;
|
||||
|
||||
pc = per_cpu(cpu_hw_events, i).shared_regs;
|
||||
if (pc && pc->core_id == core_id) {
|
||||
cpuc->kfree_on_online = cpuc->shared_regs;
|
||||
*onln = cpuc->shared_regs;
|
||||
cpuc->shared_regs = pc;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue