diff options
Diffstat (limited to 'kernel/bpf/arraymap.c')
-rw-r--r-- | kernel/bpf/arraymap.c | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index 172dc8ee0e3b..ecb43542246e 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c | |||
@@ -452,38 +452,24 @@ static void bpf_event_entry_free_rcu(struct bpf_event_entry *ee) | |||
452 | static void *perf_event_fd_array_get_ptr(struct bpf_map *map, | 452 | static void *perf_event_fd_array_get_ptr(struct bpf_map *map, |
453 | struct file *map_file, int fd) | 453 | struct file *map_file, int fd) |
454 | { | 454 | { |
455 | const struct perf_event_attr *attr; | ||
456 | struct bpf_event_entry *ee; | 455 | struct bpf_event_entry *ee; |
457 | struct perf_event *event; | 456 | struct perf_event *event; |
458 | struct file *perf_file; | 457 | struct file *perf_file; |
458 | u64 value; | ||
459 | 459 | ||
460 | perf_file = perf_event_get(fd); | 460 | perf_file = perf_event_get(fd); |
461 | if (IS_ERR(perf_file)) | 461 | if (IS_ERR(perf_file)) |
462 | return perf_file; | 462 | return perf_file; |
463 | 463 | ||
464 | ee = ERR_PTR(-EOPNOTSUPP); | ||
464 | event = perf_file->private_data; | 465 | event = perf_file->private_data; |
465 | ee = ERR_PTR(-EINVAL); | 466 | if (perf_event_read_local(event, &value) == -EOPNOTSUPP) |
466 | |||
467 | attr = perf_event_attrs(event); | ||
468 | if (IS_ERR(attr) || attr->inherit) | ||
469 | goto err_out; | 467 | goto err_out; |
470 | 468 | ||
471 | switch (attr->type) { | 469 | ee = bpf_event_entry_gen(perf_file, map_file); |
472 | case PERF_TYPE_SOFTWARE: | 470 | if (ee) |
473 | if (attr->config != PERF_COUNT_SW_BPF_OUTPUT) | 471 | return ee; |
474 | goto err_out; | 472 | ee = ERR_PTR(-ENOMEM); |
475 | /* fall-through */ | ||
476 | case PERF_TYPE_RAW: | ||
477 | case PERF_TYPE_HARDWARE: | ||
478 | ee = bpf_event_entry_gen(perf_file, map_file); | ||
479 | if (ee) | ||
480 | return ee; | ||
481 | ee = ERR_PTR(-ENOMEM); | ||
482 | /* fall-through */ | ||
483 | default: | ||
484 | break; | ||
485 | } | ||
486 | |||
487 | err_out: | 473 | err_out: |
488 | fput(perf_file); | 474 | fput(perf_file); |
489 | return ee; | 475 | return ee; |