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

Commit a7ac67ea authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

perf: Remove the perf_output_begin(.sample) argument



Since only samples call perf_output_sample() its much saner (and more
correct) to put the sample logic in there than in the
perf_output_begin()/perf_output_end() pair.

Saves a useless argument, reduces conditionals and shrinks
struct perf_output_handle, win!

Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-2crpvsx3cqu67q3zqjbnlpsc@git.kernel.org


Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a8b0ca17
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -340,7 +340,7 @@ static int intel_pmu_drain_bts_buffer(void)
	 */
	perf_prepare_sample(&header, &data, event, &regs);

	if (perf_output_begin(&handle, event, header.size * (top - at), 1))
	if (perf_output_begin(&handle, event, header.size * (top - at)))
		return 1;

	for (; at < top; at++) {
+1 −3
Original line number Diff line number Diff line
@@ -925,7 +925,6 @@ struct perf_output_handle {
	unsigned long			size;
	void				*addr;
	int				page;
	int				sample;
};

#ifdef CONFIG_PERF_EVENTS
@@ -1117,8 +1116,7 @@ extern void perf_bp_event(struct perf_event *event, void *data);
#endif

extern int perf_output_begin(struct perf_output_handle *handle,
			     struct perf_event *event, unsigned int size,
			     int sample);
			     struct perf_event *event, unsigned int size);
extern void perf_output_end(struct perf_output_handle *handle);
extern void perf_output_copy(struct perf_output_handle *handle,
			     const void *buf, unsigned int len);
+20 −6
Original line number Diff line number Diff line
@@ -3928,6 +3928,20 @@ void perf_output_sample(struct perf_output_handle *handle,
			perf_output_put(handle, raw);
		}
	}

	if (!event->attr.watermark) {
		int wakeup_events = event->attr.wakeup_events;

		if (wakeup_events) {
			struct ring_buffer *rb = handle->rb;
			int events = local_inc_return(&rb->events);

			if (events >= wakeup_events) {
				local_sub(wakeup_events, &rb->events);
				local_inc(&rb->wakeup);
			}
		}
	}
}

void perf_prepare_sample(struct perf_event_header *header,
@@ -3984,7 +3998,7 @@ static void perf_event_output(struct perf_event *event,

	perf_prepare_sample(&header, data, event, regs);

	if (perf_output_begin(&handle, event, header.size, 1))
	if (perf_output_begin(&handle, event, header.size))
		goto exit;

	perf_output_sample(&handle, &header, data, event);
@@ -4024,7 +4038,7 @@ perf_event_read_event(struct perf_event *event,
	int ret;

	perf_event_header__init_id(&read_event.header, &sample, event);
	ret = perf_output_begin(&handle, event, read_event.header.size, 0);
	ret = perf_output_begin(&handle, event, read_event.header.size);
	if (ret)
		return;

@@ -4067,7 +4081,7 @@ static void perf_event_task_output(struct perf_event *event,
	perf_event_header__init_id(&task_event->event_id.header, &sample, event);

	ret = perf_output_begin(&handle, event,
				task_event->event_id.header.size, 0);
				task_event->event_id.header.size);
	if (ret)
		goto out;

@@ -4204,7 +4218,7 @@ static void perf_event_comm_output(struct perf_event *event,

	perf_event_header__init_id(&comm_event->event_id.header, &sample, event);
	ret = perf_output_begin(&handle, event,
				comm_event->event_id.header.size, 0);
				comm_event->event_id.header.size);

	if (ret)
		goto out;
@@ -4351,7 +4365,7 @@ static void perf_event_mmap_output(struct perf_event *event,

	perf_event_header__init_id(&mmap_event->event_id.header, &sample, event);
	ret = perf_output_begin(&handle, event,
				mmap_event->event_id.header.size, 0);
				mmap_event->event_id.header.size);
	if (ret)
		goto out;

@@ -4546,7 +4560,7 @@ static void perf_log_throttle(struct perf_event *event, int enable)
	perf_event_header__init_id(&throttle_event.header, &sample, event);

	ret = perf_output_begin(&handle, event,
				throttle_event.header.size, 0);
				throttle_event.header.size);
	if (ret)
		return;

+1 −18
Original line number Diff line number Diff line
@@ -98,8 +98,7 @@ out:
}

int perf_output_begin(struct perf_output_handle *handle,
		      struct perf_event *event, unsigned int size,
		      int sample)
		      struct perf_event *event, unsigned int size)
{
	struct ring_buffer *rb;
	unsigned long tail, offset, head;
@@ -124,7 +123,6 @@ int perf_output_begin(struct perf_output_handle *handle,

	handle->rb	= rb;
	handle->event	= event;
	handle->sample	= sample;

	if (!rb->nr_pages)
		goto out;
@@ -192,21 +190,6 @@ void perf_output_copy(struct perf_output_handle *handle,

void perf_output_end(struct perf_output_handle *handle)
{
	struct perf_event *event = handle->event;
	struct ring_buffer *rb = handle->rb;

	if (handle->sample && !event->attr.watermark) {
		int wakeup_events = event->attr.wakeup_events;

		if (wakeup_events) {
			int events = local_inc_return(&rb->events);
			if (events >= wakeup_events) {
				local_sub(wakeup_events, &rb->events);
				local_inc(&rb->wakeup);
			}
		}
	}

	perf_output_put_handle(handle);
	rcu_read_unlock();
}