Commit 4dd4c2ae authored by Robert Richter's avatar Robert Richter Committed by Ingo Molnar

perf/x86/amd: Generalize northbridge constraints code for family 15h

Generalize northbridge constraints code for family 10h so that
later we can reuse the same code path with other AMD processor
families that have the same northbridge event constraints.
Signed-off-by: default avatarRobert Richter <rric@kernel.org>
Signed-off-by: default avatarJacob Shin <jacob.shin@amd.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Stephane Eranian <eranian@google.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1360171589-6381-3-git-send-email-jacob.shin@amd.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 2c53c3dd
...@@ -188,19 +188,12 @@ static inline int amd_has_nb(struct cpu_hw_events *cpuc) ...@@ -188,19 +188,12 @@ static inline int amd_has_nb(struct cpu_hw_events *cpuc)
return nb && nb->nb_id != -1; return nb && nb->nb_id != -1;
} }
static void amd_put_event_constraints(struct cpu_hw_events *cpuc, static void __amd_put_nb_event_constraints(struct cpu_hw_events *cpuc,
struct perf_event *event) struct perf_event *event)
{ {
struct hw_perf_event *hwc = &event->hw;
struct amd_nb *nb = cpuc->amd_nb; struct amd_nb *nb = cpuc->amd_nb;
int i; int i;
/*
* only care about NB events
*/
if (!(amd_has_nb(cpuc) && amd_is_nb_event(hwc)))
return;
/* /*
* need to scan whole list because event may not have * need to scan whole list because event may not have
* been assigned during scheduling * been assigned during scheduling
...@@ -247,24 +240,19 @@ static void amd_put_event_constraints(struct cpu_hw_events *cpuc, ...@@ -247,24 +240,19 @@ static void amd_put_event_constraints(struct cpu_hw_events *cpuc,
* *
* Given that resources are allocated (cmpxchg), they must be * Given that resources are allocated (cmpxchg), they must be
* eventually freed for others to use. This is accomplished by * eventually freed for others to use. This is accomplished by
* calling amd_put_event_constraints(). * calling __amd_put_nb_event_constraints()
* *
* Non NB events are not impacted by this restriction. * Non NB events are not impacted by this restriction.
*/ */
static struct event_constraint * static struct event_constraint *
amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) __amd_get_nb_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event,
struct event_constraint *c)
{ {
struct hw_perf_event *hwc = &event->hw; struct hw_perf_event *hwc = &event->hw;
struct amd_nb *nb = cpuc->amd_nb; struct amd_nb *nb = cpuc->amd_nb;
struct perf_event *old; struct perf_event *old;
int idx, new = -1; int idx, new = -1;
/*
* if not NB event or no NB, then no constraints
*/
if (!(amd_has_nb(cpuc) && amd_is_nb_event(hwc)))
return &unconstrained;
/* /*
* detect if already present, if so reuse * detect if already present, if so reuse
* *
...@@ -275,7 +263,7 @@ amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) ...@@ -275,7 +263,7 @@ amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event)
* because of successive calls to x86_schedule_events() from * because of successive calls to x86_schedule_events() from
* hw_perf_group_sched_in() without hw_perf_enable() * hw_perf_group_sched_in() without hw_perf_enable()
*/ */
for (idx = 0; idx < x86_pmu.num_counters; idx++) { for_each_set_bit(idx, c->idxmsk, x86_pmu.num_counters) {
if (new == -1 || hwc->idx == idx) if (new == -1 || hwc->idx == idx)
/* assign free slot, prefer hwc->idx */ /* assign free slot, prefer hwc->idx */
old = cmpxchg(nb->owners + idx, NULL, event); old = cmpxchg(nb->owners + idx, NULL, event);
...@@ -391,6 +379,25 @@ static void amd_pmu_cpu_dead(int cpu) ...@@ -391,6 +379,25 @@ static void amd_pmu_cpu_dead(int cpu)
} }
} }
static struct event_constraint *
amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event)
{
/*
* if not NB event or no NB, then no constraints
*/
if (!(amd_has_nb(cpuc) && amd_is_nb_event(&event->hw)))
return &unconstrained;
return __amd_get_nb_event_constraints(cpuc, event, &unconstrained);
}
static void amd_put_event_constraints(struct cpu_hw_events *cpuc,
struct perf_event *event)
{
if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
__amd_put_nb_event_constraints(cpuc, event);
}
PMU_FORMAT_ATTR(event, "config:0-7,32-35"); PMU_FORMAT_ATTR(event, "config:0-7,32-35");
PMU_FORMAT_ATTR(umask, "config:8-15" ); PMU_FORMAT_ATTR(umask, "config:8-15" );
PMU_FORMAT_ATTR(edge, "config:18" ); PMU_FORMAT_ATTR(edge, "config:18" );
......
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