diff options
| author | Alexei Starovoitov <alexei.starovoitov@gmail.com> | 2016-01-25 23:59:49 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2016-01-29 02:35:25 -0500 |
| commit | e03e7ee34fdd1c3ef494949a75cb8c61c7265fa9 (patch) | |
| tree | 17835d21a367a7b6cea78c93c076e7f65843767f /kernel/trace | |
| parent | 828b6f0e26170938d617e99a17177453be4d77a3 (diff) | |
perf/bpf: Convert perf_event_array to use struct file
Robustify refcounting.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: vince@deater.net
Link: http://lkml.kernel.org/r/20160126045947.GA40151@ast-mbp.thefacebook.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/trace')
| -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; |
