Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4794295 authored by Eric B Munson's avatar Eric B Munson Committed by Ingo Molnar
Browse files

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: default avatarEric B Munson <emunson@mgebm.net>
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1308861279-15216-2-git-send-email-emunson@mgebm.net


Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent b7526f0c
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -3351,6 +3351,18 @@ static int perf_event_index(struct perf_event *event)
	return event->hw.idx + 1 - PERF_EVENT_INDEX_OFFSET;
}

static void calc_timer_values(struct perf_event *event,
				u64 *running,
				u64 *enabled)
{
	u64 now, ctx_time;

	now = perf_clock();
	ctx_time = event->shadow_ctx_time + now;
	*enabled = ctx_time - event->tstamp_enabled;
	*running = ctx_time - event->tstamp_running;
}

/*
 * Callers need to ensure there can be no nesting of this function, otherwise
 * 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,
static void perf_output_read(struct perf_output_handle *handle,
			     struct perf_event *event)
{
	u64 enabled = 0, running = 0, now, ctx_time;
	u64 enabled = 0, running = 0;
	u64 read_format = event->attr.read_format;

	/*
@@ -3828,12 +3840,8 @@ static void perf_output_read(struct perf_output_handle *handle,
	 * because of locking issue as we are called in
	 * NMI context
	 */
	if (read_format & PERF_FORMAT_TOTAL_TIMES) {
		now = perf_clock();
		ctx_time = event->shadow_ctx_time + now;
		enabled = ctx_time - event->tstamp_enabled;
		running = ctx_time - event->tstamp_running;
	}
	if (read_format & PERF_FORMAT_TOTAL_TIMES)
		calc_timer_values(event, &enabled, &running);

	if (event->attr.read_format & PERF_FORMAT_GROUP)
		perf_output_read_group(handle, event, enabled, running);