diff options
author | Alexei Starovoitov <ast@plumgrid.com> | 2014-09-26 03:17:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-26 15:05:14 -0400 |
commit | 09756af46893c18839062976c3252e93a1beeba7 (patch) | |
tree | 203642a5473496ecb6ff10cd22dba39b22ed5f0a /include/linux/bpf.h | |
parent | db20fd2b01087bdfbe30bce314a198eefedcc42e (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.h | 38 |
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); | |||
46 | void bpf_map_put(struct bpf_map *map); | 46 | void bpf_map_put(struct bpf_map *map); |
47 | struct bpf_map *bpf_map_get(struct fd f); | 47 | struct 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 | */ | ||
53 | struct bpf_func_proto { | ||
54 | u64 (*func)(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); | ||
55 | bool gpl_only; | ||
56 | }; | ||
57 | |||
58 | struct 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 | |||
63 | struct bpf_prog_type_list { | ||
64 | struct list_head list_node; | ||
65 | struct bpf_verifier_ops *ops; | ||
66 | enum bpf_prog_type type; | ||
67 | }; | ||
68 | |||
69 | void bpf_register_prog_type(struct bpf_prog_type_list *tl); | ||
70 | |||
71 | struct bpf_prog; | ||
72 | |||
73 | struct 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 | |||
84 | void bpf_prog_put(struct bpf_prog *prog); | ||
85 | struct bpf_prog *bpf_prog_get(u32 ufd); | ||
86 | |||
49 | #endif /* _LINUX_BPF_H */ | 87 | #endif /* _LINUX_BPF_H */ |