aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/bpf_trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/bpf_trace.c')
-rw-r--r--kernel/trace/bpf_trace.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 88a041adee90..ef9936df1b04 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -158,6 +158,35 @@ const struct bpf_func_proto *bpf_get_trace_printk_proto(void)
158 return &bpf_trace_printk_proto; 158 return &bpf_trace_printk_proto;
159} 159}
160 160
161static u64 bpf_perf_event_read(u64 r1, u64 index, u64 r3, u64 r4, u64 r5)
162{
163 struct bpf_map *map = (struct bpf_map *) (unsigned long) r1;
164 struct bpf_array *array = container_of(map, struct bpf_array, map);
165 struct perf_event *event;
166
167 if (unlikely(index >= array->map.max_entries))
168 return -E2BIG;
169
170 event = (struct perf_event *)array->ptrs[index];
171 if (!event)
172 return -ENOENT;
173
174 /*
175 * we don't know if the function is run successfully by the
176 * return value. It can be judged in other places, such as
177 * eBPF programs.
178 */
179 return perf_event_read_local(event);
180}
181
182const struct bpf_func_proto bpf_perf_event_read_proto = {
183 .func = bpf_perf_event_read,
184 .gpl_only = false,
185 .ret_type = RET_INTEGER,
186 .arg1_type = ARG_CONST_MAP_PTR,
187 .arg2_type = ARG_ANYTHING,
188};
189
161static const struct bpf_func_proto *kprobe_prog_func_proto(enum bpf_func_id func_id) 190static const struct bpf_func_proto *kprobe_prog_func_proto(enum bpf_func_id func_id)
162{ 191{
163 switch (func_id) { 192 switch (func_id) {
@@ -183,6 +212,8 @@ static const struct bpf_func_proto *kprobe_prog_func_proto(enum bpf_func_id func
183 return bpf_get_trace_printk_proto(); 212 return bpf_get_trace_printk_proto();
184 case BPF_FUNC_get_smp_processor_id: 213 case BPF_FUNC_get_smp_processor_id:
185 return &bpf_get_smp_processor_id_proto; 214 return &bpf_get_smp_processor_id_proto;
215 case BPF_FUNC_perf_event_read:
216 return &bpf_perf_event_read_proto;
186 default: 217 default:
187 return NULL; 218 return NULL;
188 } 219 }