|
@@ -225,11 +225,12 @@ static const struct bpf_func_proto bpf_perf_event_read_proto = {
|
|
|
.arg2_type = ARG_ANYTHING,
|
|
|
};
|
|
|
|
|
|
-static u64 bpf_perf_event_output(u64 r1, u64 r2, u64 index, u64 r4, u64 size)
|
|
|
+static u64 bpf_perf_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size)
|
|
|
{
|
|
|
struct pt_regs *regs = (struct pt_regs *) (long) r1;
|
|
|
struct bpf_map *map = (struct bpf_map *) (long) r2;
|
|
|
struct bpf_array *array = container_of(map, struct bpf_array, map);
|
|
|
+ u64 index = flags & BPF_F_INDEX_MASK;
|
|
|
void *data = (void *) (long) r4;
|
|
|
struct perf_sample_data sample_data;
|
|
|
struct perf_event *event;
|
|
@@ -239,6 +240,10 @@ static u64 bpf_perf_event_output(u64 r1, u64 r2, u64 index, u64 r4, u64 size)
|
|
|
.data = data,
|
|
|
};
|
|
|
|
|
|
+ if (unlikely(flags & ~(BPF_F_INDEX_MASK)))
|
|
|
+ return -EINVAL;
|
|
|
+ if (index == BPF_F_CURRENT_CPU)
|
|
|
+ index = raw_smp_processor_id();
|
|
|
if (unlikely(index >= array->map.max_entries))
|
|
|
return -E2BIG;
|
|
|
|