Commit c4794295917ebeda8013b6cb9c8d71ab4f74a1fa
Committed by
Ingo Molnar
1 parent
b7526f0ca6
Exists in
master
and in
4 other branches
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); |