diff options
Diffstat (limited to 'kernel/trace/bpf_trace.c')
-rw-r--r-- | kernel/trace/bpf_trace.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 45dd798bcd37..326a75e884db 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c | |||
@@ -191,14 +191,17 @@ static u64 bpf_perf_event_read(u64 r1, u64 index, u64 r3, u64 r4, u64 r5) | |||
191 | struct bpf_map *map = (struct bpf_map *) (unsigned long) r1; | 191 | struct bpf_map *map = (struct bpf_map *) (unsigned long) r1; |
192 | struct bpf_array *array = container_of(map, struct bpf_array, map); | 192 | struct bpf_array *array = container_of(map, struct bpf_array, map); |
193 | struct perf_event *event; | 193 | struct perf_event *event; |
194 | struct file *file; | ||
194 | 195 | ||
195 | if (unlikely(index >= array->map.max_entries)) | 196 | if (unlikely(index >= array->map.max_entries)) |
196 | return -E2BIG; | 197 | return -E2BIG; |
197 | 198 | ||
198 | event = (struct perf_event *)array->ptrs[index]; | 199 | file = (struct file *)array->ptrs[index]; |
199 | if (!event) | 200 | if (unlikely(!file)) |
200 | return -ENOENT; | 201 | return -ENOENT; |
201 | 202 | ||
203 | event = file->private_data; | ||
204 | |||
202 | /* make sure event is local and doesn't have pmu::count */ | 205 | /* make sure event is local and doesn't have pmu::count */ |
203 | if (event->oncpu != smp_processor_id() || | 206 | if (event->oncpu != smp_processor_id() || |
204 | event->pmu->count) | 207 | event->pmu->count) |
@@ -228,6 +231,7 @@ static u64 bpf_perf_event_output(u64 r1, u64 r2, u64 index, u64 r4, u64 size) | |||
228 | void *data = (void *) (long) r4; | 231 | void *data = (void *) (long) r4; |
229 | struct perf_sample_data sample_data; | 232 | struct perf_sample_data sample_data; |
230 | struct perf_event *event; | 233 | struct perf_event *event; |
234 | struct file *file; | ||
231 | struct perf_raw_record raw = { | 235 | struct perf_raw_record raw = { |
232 | .size = size, | 236 | .size = size, |
233 | .data = data, | 237 | .data = data, |
@@ -236,10 +240,12 @@ static u64 bpf_perf_event_output(u64 r1, u64 r2, u64 index, u64 r4, u64 size) | |||
236 | if (unlikely(index >= array->map.max_entries)) | 240 | if (unlikely(index >= array->map.max_entries)) |
237 | return -E2BIG; | 241 | return -E2BIG; |
238 | 242 | ||
239 | event = (struct perf_event *)array->ptrs[index]; | 243 | file = (struct file *)array->ptrs[index]; |
240 | if (unlikely(!event)) | 244 | if (unlikely(!file)) |
241 | return -ENOENT; | 245 | return -ENOENT; |
242 | 246 | ||
247 | event = file->private_data; | ||
248 | |||
243 | if (unlikely(event->attr.type != PERF_TYPE_SOFTWARE || | 249 | if (unlikely(event->attr.type != PERF_TYPE_SOFTWARE || |
244 | event->attr.config != PERF_COUNT_SW_BPF_OUTPUT)) | 250 | event->attr.config != PERF_COUNT_SW_BPF_OUTPUT)) |
245 | return -EINVAL; | 251 | return -EINVAL; |