Commit c4794295917ebeda8013b6cb9c8d71ab4f74a1fa

Authored by Eric B Munson
Committed by Ingo Molnar
1 parent b7526f0ca6

events: Move lockless timer calculation into helper function

Take the timer calculation from perf_output_read and move it to a helper
function for any place that needs timer values but cannot take the ctx->lock.

Signed-off-by: Eric B Munson <emunson@mgebm.net>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1308861279-15216-2-git-send-email-emunson@mgebm.net
Signed-off-by: Ingo Molnar <mingo@elte.hu>

Showing 1 changed file with 15 additions and 7 deletions Side-by-side Diff

kernel/events/core.c
... ... @@ -3351,6 +3351,18 @@
3351 3351 return event->hw.idx + 1 - PERF_EVENT_INDEX_OFFSET;
3352 3352 }
3353 3353  
  3354 +static void calc_timer_values(struct perf_event *event,
  3355 + u64 *running,
  3356 + u64 *enabled)
  3357 +{
  3358 + u64 now, ctx_time;
  3359 +
  3360 + now = perf_clock();
  3361 + ctx_time = event->shadow_ctx_time + now;
  3362 + *enabled = ctx_time - event->tstamp_enabled;
  3363 + *running = ctx_time - event->tstamp_running;
  3364 +}
  3365 +
3354 3366 /*
3355 3367 * Callers need to ensure there can be no nesting of this function, otherwise
3356 3368 * the seqlock logic goes bad. We can not serialize this because the arch
... ... @@ -3816,7 +3828,7 @@
3816 3828 static void perf_output_read(struct perf_output_handle *handle,
3817 3829 struct perf_event *event)
3818 3830 {
3819   - u64 enabled = 0, running = 0, now, ctx_time;
  3831 + u64 enabled = 0, running = 0;
3820 3832 u64 read_format = event->attr.read_format;
3821 3833  
3822 3834 /*
... ... @@ -3828,12 +3840,8 @@
3828 3840 * because of locking issue as we are called in
3829 3841 * NMI context
3830 3842 */
3831   - if (read_format & PERF_FORMAT_TOTAL_TIMES) {
3832   - now = perf_clock();
3833   - ctx_time = event->shadow_ctx_time + now;
3834   - enabled = ctx_time - event->tstamp_enabled;
3835   - running = ctx_time - event->tstamp_running;
3836   - }
  3843 + if (read_format & PERF_FORMAT_TOTAL_TIMES)
  3844 + calc_timer_values(event, &enabled, &running);
3837 3845  
3838 3846 if (event->attr.read_format & PERF_FORMAT_GROUP)
3839 3847 perf_output_read_group(handle, event, enabled, running);