Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 350049
b: refs/heads/master
c: 2c53c3d
h: refs/heads/master
i:
  350047: d06e0db
v: v3
  • Loading branch information
Robert Richter authored and Ingo Molnar committed Feb 6, 2013
1 parent ca5a4e5 commit a9e00e0
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 43 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f2b4367a69c60c644a1df36f63a65e0e677d3b0f
refs/heads/master: 2c53c3dd0b6497484b29fd49d34ef98acbc14577
68 changes: 26 additions & 42 deletions trunk/arch/x86/kernel/cpu/perf_event_amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,8 @@ amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event)
{
struct hw_perf_event *hwc = &event->hw;
struct amd_nb *nb = cpuc->amd_nb;
struct perf_event *old = NULL;
int max = x86_pmu.num_counters;
int i, j, k = -1;
struct perf_event *old;
int idx, new = -1;

/*
* if not NB event or no NB, then no constraints
Expand All @@ -276,48 +275,33 @@ amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event)
* because of successive calls to x86_schedule_events() from
* hw_perf_group_sched_in() without hw_perf_enable()
*/
for (i = 0; i < max; i++) {
/*
* keep track of first free slot
*/
if (k == -1 && !nb->owners[i])
k = i;
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
if (new == -1 || hwc->idx == idx)
/* assign free slot, prefer hwc->idx */
old = cmpxchg(nb->owners + idx, NULL, event);
else if (nb->owners[idx] == event)
/* event already present */
old = event;
else
continue;

if (old && old != event)
continue;

/* reassign to this slot */
if (new != -1)
cmpxchg(nb->owners + new, event, NULL);
new = idx;

/* already present, reuse */
if (nb->owners[i] == event)
goto done;
}
/*
* not present, so grab a new slot
* starting either at:
*/
if (hwc->idx != -1) {
/* previous assignment */
i = hwc->idx;
} else if (k != -1) {
/* start from free slot found */
i = k;
} else {
/*
* event not found, no slot found in
* first pass, try again from the
* beginning
*/
i = 0;
}
j = i;
do {
old = cmpxchg(nb->owners+i, NULL, event);
if (!old)
if (old == event)
break;
if (++i == max)
i = 0;
} while (i != j);
done:
if (!old)
return &nb->event_constraints[i];

return &emptyconstraint;
}

if (new == -1)
return &emptyconstraint;

return &nb->event_constraints[new];
}

static struct amd_nb *amd_alloc_nb(int cpu)
Expand Down

0 comments on commit a9e00e0

Please sign in to comment.