diff options
author | Eric B Munson <emunson@mgebm.net> | 2011-06-23 16:34:38 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-07-01 05:06:33 -0400 |
commit | c4794295917ebeda8013b6cb9c8d71ab4f74a1fa (patch) | |
tree | bb422e3368f2ad686e69229b416536b2bcb1df8e /kernel | |
parent | b7526f0ca6dc68f57ca467ce503151b1d476a3e4 (diff) |
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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 2293e0b084a9..c851d707821f 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -3351,6 +3351,18 @@ static int perf_event_index(struct perf_event *event) | |||
3351 | return event->hw.idx + 1 - PERF_EVENT_INDEX_OFFSET; | 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 | * Callers need to ensure there can be no nesting of this function, otherwise | 3367 | * Callers need to ensure there can be no nesting of this function, otherwise |
3356 | * the seqlock logic goes bad. We can not serialize this because the arch | 3368 | * the seqlock logic goes bad. We can not serialize this because the arch |
@@ -3816,7 +3828,7 @@ static void perf_output_read_group(struct perf_output_handle *handle, | |||
3816 | static void perf_output_read(struct perf_output_handle *handle, | 3828 | static void perf_output_read(struct perf_output_handle *handle, |
3817 | struct perf_event *event) | 3829 | struct perf_event *event) |
3818 | { | 3830 | { |
3819 | u64 enabled = 0, running = 0, now, ctx_time; | 3831 | u64 enabled = 0, running = 0; |
3820 | u64 read_format = event->attr.read_format; | 3832 | u64 read_format = event->attr.read_format; |
3821 | 3833 | ||
3822 | /* | 3834 | /* |
@@ -3828,12 +3840,8 @@ static void perf_output_read(struct perf_output_handle *handle, | |||
3828 | * because of locking issue as we are called in | 3840 | * because of locking issue as we are called in |
3829 | * NMI context | 3841 | * NMI context |
3830 | */ | 3842 | */ |
3831 | if (read_format & PERF_FORMAT_TOTAL_TIMES) { | 3843 | if (read_format & PERF_FORMAT_TOTAL_TIMES) |
3832 | now = perf_clock(); | 3844 | calc_timer_values(event, &enabled, &running); |
3833 | ctx_time = event->shadow_ctx_time + now; | ||
3834 | enabled = ctx_time - event->tstamp_enabled; | ||
3835 | running = ctx_time - event->tstamp_running; | ||
3836 | } | ||
3837 | 3845 | ||
3838 | if (event->attr.read_format & PERF_FORMAT_GROUP) | 3846 | if (event->attr.read_format & PERF_FORMAT_GROUP) |
3839 | perf_output_read_group(handle, event, enabled, running); | 3847 | perf_output_read_group(handle, event, enabled, running); |