diff options
Diffstat (limited to 'kernel/bpf')
-rw-r--r-- | kernel/bpf/core.c | 9 | ||||
-rw-r--r-- | kernel/bpf/inode.c | 17 | ||||
-rw-r--r-- | kernel/bpf/syscall.c | 19 |
3 files changed, 42 insertions, 3 deletions
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 503d4211988a..fddd76b1b627 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c | |||
@@ -1173,3 +1173,12 @@ int __weak skb_copy_bits(const struct sk_buff *skb, int offset, void *to, | |||
1173 | { | 1173 | { |
1174 | return -EFAULT; | 1174 | return -EFAULT; |
1175 | } | 1175 | } |
1176 | |||
1177 | /* All definitions of tracepoints related to BPF. */ | ||
1178 | #define CREATE_TRACE_POINTS | ||
1179 | #include <linux/bpf_trace.h> | ||
1180 | |||
1181 | EXPORT_TRACEPOINT_SYMBOL_GPL(xdp_exception); | ||
1182 | |||
1183 | EXPORT_TRACEPOINT_SYMBOL_GPL(bpf_prog_get_type); | ||
1184 | EXPORT_TRACEPOINT_SYMBOL_GPL(bpf_prog_put_rcu); | ||
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c index 0b030c9126d3..fddcae801724 100644 --- a/kernel/bpf/inode.c +++ b/kernel/bpf/inode.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/parser.h> | 21 | #include <linux/parser.h> |
22 | #include <linux/filter.h> | 22 | #include <linux/filter.h> |
23 | #include <linux/bpf.h> | 23 | #include <linux/bpf.h> |
24 | #include <linux/bpf_trace.h> | ||
24 | 25 | ||
25 | enum bpf_type { | 26 | enum bpf_type { |
26 | BPF_TYPE_UNSPEC = 0, | 27 | BPF_TYPE_UNSPEC = 0, |
@@ -281,6 +282,13 @@ int bpf_obj_pin_user(u32 ufd, const char __user *pathname) | |||
281 | ret = bpf_obj_do_pin(pname, raw, type); | 282 | ret = bpf_obj_do_pin(pname, raw, type); |
282 | if (ret != 0) | 283 | if (ret != 0) |
283 | bpf_any_put(raw, type); | 284 | bpf_any_put(raw, type); |
285 | if ((trace_bpf_obj_pin_prog_enabled() || | ||
286 | trace_bpf_obj_pin_map_enabled()) && !ret) { | ||
287 | if (type == BPF_TYPE_PROG) | ||
288 | trace_bpf_obj_pin_prog(raw, ufd, pname); | ||
289 | if (type == BPF_TYPE_MAP) | ||
290 | trace_bpf_obj_pin_map(raw, ufd, pname); | ||
291 | } | ||
284 | out: | 292 | out: |
285 | putname(pname); | 293 | putname(pname); |
286 | return ret; | 294 | return ret; |
@@ -342,8 +350,15 @@ int bpf_obj_get_user(const char __user *pathname) | |||
342 | else | 350 | else |
343 | goto out; | 351 | goto out; |
344 | 352 | ||
345 | if (ret < 0) | 353 | if (ret < 0) { |
346 | bpf_any_put(raw, type); | 354 | bpf_any_put(raw, type); |
355 | } else if (trace_bpf_obj_get_prog_enabled() || | ||
356 | trace_bpf_obj_get_map_enabled()) { | ||
357 | if (type == BPF_TYPE_PROG) | ||
358 | trace_bpf_obj_get_prog(raw, ret, pname); | ||
359 | if (type == BPF_TYPE_MAP) | ||
360 | trace_bpf_obj_get_map(raw, ret, pname); | ||
361 | } | ||
347 | out: | 362 | out: |
348 | putname(pname); | 363 | putname(pname); |
349 | return ret; | 364 | return ret; |
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 1d6b29e4e2c3..05ad086ab71d 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * General Public License for more details. | 10 | * General Public License for more details. |
11 | */ | 11 | */ |
12 | #include <linux/bpf.h> | 12 | #include <linux/bpf.h> |
13 | #include <linux/bpf_trace.h> | ||
13 | #include <linux/syscalls.h> | 14 | #include <linux/syscalls.h> |
14 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
15 | #include <linux/anon_inodes.h> | 16 | #include <linux/anon_inodes.h> |
@@ -215,6 +216,7 @@ static int map_create(union bpf_attr *attr) | |||
215 | /* failed to allocate fd */ | 216 | /* failed to allocate fd */ |
216 | goto free_map; | 217 | goto free_map; |
217 | 218 | ||
219 | trace_bpf_map_create(map, err); | ||
218 | return err; | 220 | return err; |
219 | 221 | ||
220 | free_map: | 222 | free_map: |
@@ -339,6 +341,7 @@ static int map_lookup_elem(union bpf_attr *attr) | |||
339 | if (copy_to_user(uvalue, value, value_size) != 0) | 341 | if (copy_to_user(uvalue, value, value_size) != 0) |
340 | goto free_value; | 342 | goto free_value; |
341 | 343 | ||
344 | trace_bpf_map_lookup_elem(map, ufd, key, value); | ||
342 | err = 0; | 345 | err = 0; |
343 | 346 | ||
344 | free_value: | 347 | free_value: |
@@ -421,6 +424,8 @@ static int map_update_elem(union bpf_attr *attr) | |||
421 | __this_cpu_dec(bpf_prog_active); | 424 | __this_cpu_dec(bpf_prog_active); |
422 | preempt_enable(); | 425 | preempt_enable(); |
423 | 426 | ||
427 | if (!err) | ||
428 | trace_bpf_map_update_elem(map, ufd, key, value); | ||
424 | free_value: | 429 | free_value: |
425 | kfree(value); | 430 | kfree(value); |
426 | free_key: | 431 | free_key: |
@@ -466,6 +471,8 @@ static int map_delete_elem(union bpf_attr *attr) | |||
466 | __this_cpu_dec(bpf_prog_active); | 471 | __this_cpu_dec(bpf_prog_active); |
467 | preempt_enable(); | 472 | preempt_enable(); |
468 | 473 | ||
474 | if (!err) | ||
475 | trace_bpf_map_delete_elem(map, ufd, key); | ||
469 | free_key: | 476 | free_key: |
470 | kfree(key); | 477 | kfree(key); |
471 | err_put: | 478 | err_put: |
@@ -518,6 +525,7 @@ static int map_get_next_key(union bpf_attr *attr) | |||
518 | if (copy_to_user(unext_key, next_key, map->key_size) != 0) | 525 | if (copy_to_user(unext_key, next_key, map->key_size) != 0) |
519 | goto free_next_key; | 526 | goto free_next_key; |
520 | 527 | ||
528 | trace_bpf_map_next_key(map, ufd, key, next_key); | ||
521 | err = 0; | 529 | err = 0; |
522 | 530 | ||
523 | free_next_key: | 531 | free_next_key: |
@@ -671,8 +679,10 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu) | |||
671 | 679 | ||
672 | void bpf_prog_put(struct bpf_prog *prog) | 680 | void bpf_prog_put(struct bpf_prog *prog) |
673 | { | 681 | { |
674 | if (atomic_dec_and_test(&prog->aux->refcnt)) | 682 | if (atomic_dec_and_test(&prog->aux->refcnt)) { |
683 | trace_bpf_prog_put_rcu(prog); | ||
675 | call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu); | 684 | call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu); |
685 | } | ||
676 | } | 686 | } |
677 | EXPORT_SYMBOL_GPL(bpf_prog_put); | 687 | EXPORT_SYMBOL_GPL(bpf_prog_put); |
678 | 688 | ||
@@ -781,7 +791,11 @@ struct bpf_prog *bpf_prog_get(u32 ufd) | |||
781 | 791 | ||
782 | struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type) | 792 | struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type) |
783 | { | 793 | { |
784 | return __bpf_prog_get(ufd, &type); | 794 | struct bpf_prog *prog = __bpf_prog_get(ufd, &type); |
795 | |||
796 | if (!IS_ERR(prog)) | ||
797 | trace_bpf_prog_get_type(prog); | ||
798 | return prog; | ||
785 | } | 799 | } |
786 | EXPORT_SYMBOL_GPL(bpf_prog_get_type); | 800 | EXPORT_SYMBOL_GPL(bpf_prog_get_type); |
787 | 801 | ||
@@ -863,6 +877,7 @@ static int bpf_prog_load(union bpf_attr *attr) | |||
863 | /* failed to allocate fd */ | 877 | /* failed to allocate fd */ |
864 | goto free_used_maps; | 878 | goto free_used_maps; |
865 | 879 | ||
880 | trace_bpf_prog_load(prog, err); | ||
866 | return err; | 881 | return err; |
867 | 882 | ||
868 | free_used_maps: | 883 | free_used_maps: |