diff options
Diffstat (limited to 'kernel/bpf/arraymap.c')
-rw-r--r-- | kernel/bpf/arraymap.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index b0799bced518..89ebbc4d1164 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c | |||
@@ -291,10 +291,13 @@ static void *perf_event_fd_array_get_ptr(struct bpf_map *map, int fd) | |||
291 | { | 291 | { |
292 | struct perf_event *event; | 292 | struct perf_event *event; |
293 | const struct perf_event_attr *attr; | 293 | const struct perf_event_attr *attr; |
294 | struct file *file; | ||
294 | 295 | ||
295 | event = perf_event_get(fd); | 296 | file = perf_event_get(fd); |
296 | if (IS_ERR(event)) | 297 | if (IS_ERR(file)) |
297 | return event; | 298 | return file; |
299 | |||
300 | event = file->private_data; | ||
298 | 301 | ||
299 | attr = perf_event_attrs(event); | 302 | attr = perf_event_attrs(event); |
300 | if (IS_ERR(attr)) | 303 | if (IS_ERR(attr)) |
@@ -304,24 +307,22 @@ static void *perf_event_fd_array_get_ptr(struct bpf_map *map, int fd) | |||
304 | goto err; | 307 | goto err; |
305 | 308 | ||
306 | if (attr->type == PERF_TYPE_RAW) | 309 | if (attr->type == PERF_TYPE_RAW) |
307 | return event; | 310 | return file; |
308 | 311 | ||
309 | if (attr->type == PERF_TYPE_HARDWARE) | 312 | if (attr->type == PERF_TYPE_HARDWARE) |
310 | return event; | 313 | return file; |
311 | 314 | ||
312 | if (attr->type == PERF_TYPE_SOFTWARE && | 315 | if (attr->type == PERF_TYPE_SOFTWARE && |
313 | attr->config == PERF_COUNT_SW_BPF_OUTPUT) | 316 | attr->config == PERF_COUNT_SW_BPF_OUTPUT) |
314 | return event; | 317 | return file; |
315 | err: | 318 | err: |
316 | perf_event_release_kernel(event); | 319 | fput(file); |
317 | return ERR_PTR(-EINVAL); | 320 | return ERR_PTR(-EINVAL); |
318 | } | 321 | } |
319 | 322 | ||
320 | static void perf_event_fd_array_put_ptr(void *ptr) | 323 | static void perf_event_fd_array_put_ptr(void *ptr) |
321 | { | 324 | { |
322 | struct perf_event *event = ptr; | 325 | fput((struct file *)ptr); |
323 | |||
324 | perf_event_release_kernel(event); | ||
325 | } | 326 | } |
326 | 327 | ||
327 | static const struct bpf_map_ops perf_event_array_ops = { | 328 | static const struct bpf_map_ops perf_event_array_ops = { |