bpf: Add attach_btf_id attribute to program load
authorAlexei Starovoitov <ast@kernel.org>
Wed, 16 Oct 2019 03:24:58 +0000 (20:24 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 17 Oct 2019 14:44:35 +0000 (16:44 +0200)
Add attach_btf_id attribute to prog_load command.
It's similar to existing expected_attach_type attribute which is
used in several cgroup based program types.
Unfortunately expected_attach_type is ignored for
tracing programs and cannot be reused for new purpose.
Hence introduce attach_btf_id to verify bpf programs against
given in-kernel BTF type id at load time.
It is strictly checked to be valid for raw_tp programs only.
In a later patches it will become:
btf_id == 0 semantics of existing raw_tp progs.
btd_id > 0 raw_tp with BTF and additional type safety.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20191016032505.2089704-5-ast@kernel.org
include/linux/bpf.h
include/uapi/linux/bpf.h
kernel/bpf/syscall.c
tools/include/uapi/linux/bpf.h

index 282e28bf41ec627cad63c6b5bc3f439dc5f58f56..f916380675dd9e211fdc5d8f383a0962a4330db0 100644 (file)
@@ -375,6 +375,7 @@ struct bpf_prog_aux {
        u32 id;
        u32 func_cnt; /* used by non-func prog as the number of func progs */
        u32 func_idx; /* 0 for non-func prog, the index in func array for func prog */
+       u32 attach_btf_id; /* in-kernel BTF type id to attach to */
        bool verifier_zext; /* Zero extensions has been inserted by verifier. */
        bool offload_requested;
        struct bpf_prog **func;
index a65c3b0c69353c9e561af59bb3ed1bb3929010dc..3bb2cd1de341c60dae7536e6db8cbee975d14f71 100644 (file)
@@ -420,6 +420,7 @@ union bpf_attr {
                __u32           line_info_rec_size;     /* userspace bpf_line_info size */
                __aligned_u64   line_info;      /* line info */
                __u32           line_info_cnt;  /* number of bpf_line_info records */
+               __u32           attach_btf_id;  /* in-kernel BTF type id to attach to */
        };
 
        struct { /* anonymous struct used by BPF_OBJ_* commands */
index 82eabd4e38adda6e95f8113d9a7f9bb61b45ab00..b56c482c976028405d60d90c6a7b91122a94a44f 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/timekeeping.h>
 #include <linux/ctype.h>
 #include <linux/nospec.h>
+#include <uapi/linux/btf.h>
 
 #define IS_FD_ARRAY(map) ((map)->map_type == BPF_MAP_TYPE_PROG_ARRAY || \
                           (map)->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY || \
@@ -1565,8 +1566,9 @@ static void bpf_prog_load_fixup_attach_type(union bpf_attr *attr)
 }
 
 static int
-bpf_prog_load_check_attach_type(enum bpf_prog_type prog_type,
-                               enum bpf_attach_type expected_attach_type)
+bpf_prog_load_check_attach(enum bpf_prog_type prog_type,
+                          enum bpf_attach_type expected_attach_type,
+                          u32 btf_id)
 {
        switch (prog_type) {
        case BPF_PROG_TYPE_CGROUP_SOCK:
@@ -1608,13 +1610,19 @@ bpf_prog_load_check_attach_type(enum bpf_prog_type prog_type,
                default:
                        return -EINVAL;
                }
+       case BPF_PROG_TYPE_RAW_TRACEPOINT:
+               if (btf_id > BTF_MAX_TYPE)
+                       return -EINVAL;
+               return 0;
        default:
+               if (btf_id)
+                       return -EINVAL;
                return 0;
        }
 }
 
 /* last field in 'union bpf_attr' used by this command */
-#define        BPF_PROG_LOAD_LAST_FIELD line_info_cnt
+#define        BPF_PROG_LOAD_LAST_FIELD attach_btf_id
 
 static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
 {
@@ -1656,7 +1664,8 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
                return -EPERM;
 
        bpf_prog_load_fixup_attach_type(attr);
-       if (bpf_prog_load_check_attach_type(type, attr->expected_attach_type))
+       if (bpf_prog_load_check_attach(type, attr->expected_attach_type,
+                                      attr->attach_btf_id))
                return -EINVAL;
 
        /* plain bpf_prog allocation */
@@ -1665,6 +1674,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
                return -ENOMEM;
 
        prog->expected_attach_type = attr->expected_attach_type;
+       prog->aux->attach_btf_id = attr->attach_btf_id;
 
        prog->aux->offload_requested = !!attr->prog_ifindex;
 
index a65c3b0c69353c9e561af59bb3ed1bb3929010dc..3bb2cd1de341c60dae7536e6db8cbee975d14f71 100644 (file)
@@ -420,6 +420,7 @@ union bpf_attr {
                __u32           line_info_rec_size;     /* userspace bpf_line_info size */
                __aligned_u64   line_info;      /* line info */
                __u32           line_info_cnt;  /* number of bpf_line_info records */
+               __u32           attach_btf_id;  /* in-kernel BTF type id to attach to */
        };
 
        struct { /* anonymous struct used by BPF_OBJ_* commands */