diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2011-06-27 10:47:16 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-07-01 05:06:35 -0400 |
commit | a7ac67ea021b4603095d2aa458bc41641238f22c (patch) | |
tree | e79d13a1096e751061af285265b1862d7e6dca70 /kernel | |
parent | a8b0ca17b80e92faab46ee7179ba9e99ccb61233 (diff) |
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: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-2crpvsx3cqu67q3zqjbnlpsc@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 26 | ||||
-rw-r--r-- | kernel/events/ring_buffer.c | 19 |
2 files changed, 21 insertions, 24 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index dbd1ca75bd3c..81de28dcca8c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -3928,6 +3928,20 @@ void perf_output_sample(struct perf_output_handle *handle, | |||
3928 | perf_output_put(handle, raw); | 3928 | perf_output_put(handle, raw); |
3929 | } | 3929 | } |
3930 | } | 3930 | } |
3931 | |||
3932 | if (!event->attr.watermark) { | ||
3933 | int wakeup_events = event->attr.wakeup_events; | ||
3934 | |||
3935 | if (wakeup_events) { | ||
3936 | struct ring_buffer *rb = handle->rb; | ||
3937 | int events = local_inc_return(&rb->events); | ||
3938 | |||
3939 | if (events >= wakeup_events) { | ||
3940 | local_sub(wakeup_events, &rb->events); | ||
3941 | local_inc(&rb->wakeup); | ||
3942 | } | ||
3943 | } | ||
3944 | } | ||
3931 | } | 3945 | } |
3932 | 3946 | ||
3933 | void perf_prepare_sample(struct perf_event_header *header, | 3947 | void perf_prepare_sample(struct perf_event_header *header, |
@@ -3984,7 +3998,7 @@ static void perf_event_output(struct perf_event *event, | |||
3984 | 3998 | ||
3985 | perf_prepare_sample(&header, data, event, regs); | 3999 | perf_prepare_sample(&header, data, event, regs); |
3986 | 4000 | ||
3987 | if (perf_output_begin(&handle, event, header.size, 1)) | 4001 | if (perf_output_begin(&handle, event, header.size)) |
3988 | goto exit; | 4002 | goto exit; |
3989 | 4003 | ||
3990 | perf_output_sample(&handle, &header, data, event); | 4004 | perf_output_sample(&handle, &header, data, event); |
@@ -4024,7 +4038,7 @@ perf_event_read_event(struct perf_event *event, | |||
4024 | int ret; | 4038 | int ret; |
4025 | 4039 | ||
4026 | perf_event_header__init_id(&read_event.header, &sample, event); | 4040 | perf_event_header__init_id(&read_event.header, &sample, event); |
4027 | ret = perf_output_begin(&handle, event, read_event.header.size, 0); | 4041 | ret = perf_output_begin(&handle, event, read_event.header.size); |
4028 | if (ret) | 4042 | if (ret) |
4029 | return; | 4043 | return; |
4030 | 4044 | ||
@@ -4067,7 +4081,7 @@ static void perf_event_task_output(struct perf_event *event, | |||
4067 | perf_event_header__init_id(&task_event->event_id.header, &sample, event); | 4081 | perf_event_header__init_id(&task_event->event_id.header, &sample, event); |
4068 | 4082 | ||
4069 | ret = perf_output_begin(&handle, event, | 4083 | ret = perf_output_begin(&handle, event, |
4070 | task_event->event_id.header.size, 0); | 4084 | task_event->event_id.header.size); |
4071 | if (ret) | 4085 | if (ret) |
4072 | goto out; | 4086 | goto out; |
4073 | 4087 | ||
@@ -4204,7 +4218,7 @@ static void perf_event_comm_output(struct perf_event *event, | |||
4204 | 4218 | ||
4205 | perf_event_header__init_id(&comm_event->event_id.header, &sample, event); | 4219 | perf_event_header__init_id(&comm_event->event_id.header, &sample, event); |
4206 | ret = perf_output_begin(&handle, event, | 4220 | ret = perf_output_begin(&handle, event, |
4207 | comm_event->event_id.header.size, 0); | 4221 | comm_event->event_id.header.size); |
4208 | 4222 | ||
4209 | if (ret) | 4223 | if (ret) |
4210 | goto out; | 4224 | goto out; |
@@ -4351,7 +4365,7 @@ static void perf_event_mmap_output(struct perf_event *event, | |||
4351 | 4365 | ||
4352 | perf_event_header__init_id(&mmap_event->event_id.header, &sample, event); | 4366 | perf_event_header__init_id(&mmap_event->event_id.header, &sample, event); |
4353 | ret = perf_output_begin(&handle, event, | 4367 | ret = perf_output_begin(&handle, event, |
4354 | mmap_event->event_id.header.size, 0); | 4368 | mmap_event->event_id.header.size); |
4355 | if (ret) | 4369 | if (ret) |
4356 | goto out; | 4370 | goto out; |
4357 | 4371 | ||
@@ -4546,7 +4560,7 @@ static void perf_log_throttle(struct perf_event *event, int enable) | |||
4546 | perf_event_header__init_id(&throttle_event.header, &sample, event); | 4560 | perf_event_header__init_id(&throttle_event.header, &sample, event); |
4547 | 4561 | ||
4548 | ret = perf_output_begin(&handle, event, | 4562 | ret = perf_output_begin(&handle, event, |
4549 | throttle_event.header.size, 0); | 4563 | throttle_event.header.size); |
4550 | if (ret) | 4564 | if (ret) |
4551 | return; | 4565 | return; |
4552 | 4566 | ||
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index 8b3b73630fa4..a2a29205cc0f 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c | |||
@@ -98,8 +98,7 @@ out: | |||
98 | } | 98 | } |
99 | 99 | ||
100 | int perf_output_begin(struct perf_output_handle *handle, | 100 | int perf_output_begin(struct perf_output_handle *handle, |
101 | struct perf_event *event, unsigned int size, | 101 | struct perf_event *event, unsigned int size) |
102 | int sample) | ||
103 | { | 102 | { |
104 | struct ring_buffer *rb; | 103 | struct ring_buffer *rb; |
105 | unsigned long tail, offset, head; | 104 | unsigned long tail, offset, head; |
@@ -124,7 +123,6 @@ int perf_output_begin(struct perf_output_handle *handle, | |||
124 | 123 | ||
125 | handle->rb = rb; | 124 | handle->rb = rb; |
126 | handle->event = event; | 125 | handle->event = event; |
127 | handle->sample = sample; | ||
128 | 126 | ||
129 | if (!rb->nr_pages) | 127 | if (!rb->nr_pages) |
130 | goto out; | 128 | goto out; |
@@ -192,21 +190,6 @@ void perf_output_copy(struct perf_output_handle *handle, | |||
192 | 190 | ||
193 | void perf_output_end(struct perf_output_handle *handle) | 191 | void perf_output_end(struct perf_output_handle *handle) |
194 | { | 192 | { |
195 | struct perf_event *event = handle->event; | ||
196 | struct ring_buffer *rb = handle->rb; | ||
197 | |||
198 | if (handle->sample && !event->attr.watermark) { | ||
199 | int wakeup_events = event->attr.wakeup_events; | ||
200 | |||
201 | if (wakeup_events) { | ||
202 | int events = local_inc_return(&rb->events); | ||
203 | if (events >= wakeup_events) { | ||
204 | local_sub(wakeup_events, &rb->events); | ||
205 | local_inc(&rb->wakeup); | ||
206 | } | ||
207 | } | ||
208 | } | ||
209 | |||
210 | perf_output_put_handle(handle); | 193 | perf_output_put_handle(handle); |
211 | rcu_read_unlock(); | 194 | rcu_read_unlock(); |
212 | } | 195 | } |