aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/bpf.h
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@plumgrid.com>2014-09-26 03:17:00 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-26 15:05:14 -0400
commit09756af46893c18839062976c3252e93a1beeba7 (patch)
tree203642a5473496ecb6ff10cd22dba39b22ed5f0a /include/linux/bpf.h
parentdb20fd2b01087bdfbe30bce314a198eefedcc42e (diff)
bpf: expand BPF syscall with program load/unload
eBPF programs are similar to kernel modules. They are loaded by the user process and automatically unloaded when process exits. Each eBPF program is a safe run-to-completion set of instructions. eBPF verifier statically determines that the program terminates and is safe to execute. The following syscall wrapper can be used to load the program: int bpf_prog_load(enum bpf_prog_type prog_type, const struct bpf_insn *insns, int insn_cnt, const char *license) { union bpf_attr attr = { .prog_type = prog_type, .insns = ptr_to_u64(insns), .insn_cnt = insn_cnt, .license = ptr_to_u64(license), }; return bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); } where 'insns' is an array of eBPF instructions and 'license' is a string that must be GPL compatible to call helper functions marked gpl_only Upon succesful load the syscall returns prog_fd. Use close(prog_fd) to unload the program. User space tests and examples follow in the later patches Signed-off-by: Alexei Starovoitov <ast@plumgrid.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/bpf.h')
-rw-r--r--include/linux/bpf.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 2887f3f9da59..92979182be81 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -46,4 +46,42 @@ void bpf_register_map_type(struct bpf_map_type_list *tl);
46void bpf_map_put(struct bpf_map *map); 46void bpf_map_put(struct bpf_map *map);
47struct bpf_map *bpf_map_get(struct fd f); 47struct bpf_map *bpf_map_get(struct fd f);
48 48
49/* eBPF function prototype used by verifier to allow BPF_CALLs from eBPF programs
50 * to in-kernel helper functions and for adjusting imm32 field in BPF_CALL
51 * instructions after verifying
52 */
53struct bpf_func_proto {
54 u64 (*func)(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
55 bool gpl_only;
56};
57
58struct bpf_verifier_ops {
59 /* return eBPF function prototype for verification */
60 const struct bpf_func_proto *(*get_func_proto)(enum bpf_func_id func_id);
61};
62
63struct bpf_prog_type_list {
64 struct list_head list_node;
65 struct bpf_verifier_ops *ops;
66 enum bpf_prog_type type;
67};
68
69void bpf_register_prog_type(struct bpf_prog_type_list *tl);
70
71struct bpf_prog;
72
73struct bpf_prog_aux {
74 atomic_t refcnt;
75 bool is_gpl_compatible;
76 enum bpf_prog_type prog_type;
77 struct bpf_verifier_ops *ops;
78 struct bpf_map **used_maps;
79 u32 used_map_cnt;
80 struct bpf_prog *prog;
81 struct work_struct work;
82};
83
84void bpf_prog_put(struct bpf_prog *prog);
85struct bpf_prog *bpf_prog_get(u32 ufd);
86
49#endif /* _LINUX_BPF_H */ 87#endif /* _LINUX_BPF_H */