Skip to content

Commit

Permalink
metag: perf: fix frequency sampling (dynamic period)
Browse files Browse the repository at this point in the history
Frequency sampling mode dynamically adjusts the sample period so as to
hit a particular frequency of samples. The sample period starts at just
1 and then gets increased if the interrupt rate is too high. This
changed sample period needs handling in metag_pmu_event_set_period to
update period_left (as the ARM equivalent does). The calculated delta
also needs subtracting from period_left in metag_pmu_event_update in
order to hit the conditional blocks in metag_pmu_event_set_period which
update last_period (which is used in the dynamic sampling period
calculation).

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
  • Loading branch information
James Hogan committed Mar 15, 2013
1 parent c6ac1e6 commit 2033dc5
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions arch/metag/kernel/perf/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ void metag_pmu_event_update(struct perf_event *event,
delta = (new_raw_count - prev_raw_count) & MAX_PERIOD;

local64_add(delta, &event->count);
local64_sub(delta, &hwc->period_left);
}

int metag_pmu_event_set_period(struct perf_event *event,
Expand All @@ -223,6 +224,10 @@ int metag_pmu_event_set_period(struct perf_event *event,
s64 period = hwc->sample_period;
int ret = 0;

/* The period may have been changed */
if (unlikely(period != hwc->last_period))
left += period - hwc->last_period;

if (unlikely(left <= -period)) {
left = period;
local64_set(&hwc->period_left, left);
Expand Down

0 comments on commit 2033dc5

Please sign in to comment.