Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools lib bpf: New API to adjust type of a BPF program

Add 4 new APIs to adjust and query the type of a BPF program.
Load program according to type set by caller. Default is set to
BPF_PROG_TYPE_KPROBE.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468406646-21642-2-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Wang Nan and committed by
Arnaldo Carvalho de Melo
5f44e4c8 1a4bf285

+55 -7
+46 -7
tools/lib/bpf/libbpf.c
··· 158 158 char *section_name; 159 159 struct bpf_insn *insns; 160 160 size_t insns_cnt; 161 + enum bpf_prog_type type; 161 162 162 163 struct { 163 164 int insn_idx; ··· 300 299 prog->idx = idx; 301 300 prog->instances.fds = NULL; 302 301 prog->instances.nr = -1; 302 + prog->type = BPF_PROG_TYPE_KPROBE; 303 303 304 304 return 0; 305 305 errout: ··· 896 894 } 897 895 898 896 static int 899 - load_program(struct bpf_insn *insns, int insns_cnt, 900 - char *license, u32 kern_version, int *pfd) 897 + load_program(enum bpf_prog_type type, struct bpf_insn *insns, 898 + int insns_cnt, char *license, u32 kern_version, int *pfd) 901 899 { 902 900 int ret; 903 901 char *log_buf; ··· 909 907 if (!log_buf) 910 908 pr_warning("Alloc log buffer for bpf loader error, continue without log\n"); 911 909 912 - ret = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns, 913 - insns_cnt, license, kern_version, 914 - log_buf, BPF_LOG_BUF_SIZE); 910 + ret = bpf_load_program(type, insns, insns_cnt, license, 911 + kern_version, log_buf, BPF_LOG_BUF_SIZE); 915 912 916 913 if (ret >= 0) { 917 914 *pfd = ret; ··· 969 968 pr_warning("Program '%s' is inconsistent: nr(%d) != 1\n", 970 969 prog->section_name, prog->instances.nr); 971 970 } 972 - err = load_program(prog->insns, prog->insns_cnt, 971 + err = load_program(prog->type, prog->insns, prog->insns_cnt, 973 972 license, kern_version, &fd); 974 973 if (!err) 975 974 prog->instances.fds[0] = fd; ··· 998 997 continue; 999 998 } 1000 999 1001 - err = load_program(result.new_insn_ptr, 1000 + err = load_program(prog->type, result.new_insn_ptr, 1002 1001 result.new_insn_cnt, 1003 1002 license, kern_version, &fd); 1004 1003 ··· 1315 1314 } 1316 1315 1317 1316 return fd; 1317 + } 1318 + 1319 + static void bpf_program__set_type(struct bpf_program *prog, 1320 + enum bpf_prog_type type) 1321 + { 1322 + prog->type = type; 1323 + } 1324 + 1325 + int bpf_program__set_tracepoint(struct bpf_program *prog) 1326 + { 1327 + if (!prog) 1328 + return -EINVAL; 1329 + bpf_program__set_type(prog, BPF_PROG_TYPE_TRACEPOINT); 1330 + return 0; 1331 + } 1332 + 1333 + int bpf_program__set_kprobe(struct bpf_program *prog) 1334 + { 1335 + if (!prog) 1336 + return -EINVAL; 1337 + bpf_program__set_type(prog, BPF_PROG_TYPE_KPROBE); 1338 + return 0; 1339 + } 1340 + 1341 + static bool bpf_program__is_type(struct bpf_program *prog, 1342 + enum bpf_prog_type type) 1343 + { 1344 + return prog ? (prog->type == type) : false; 1345 + } 1346 + 1347 + bool bpf_program__is_tracepoint(struct bpf_program *prog) 1348 + { 1349 + return bpf_program__is_type(prog, BPF_PROG_TYPE_TRACEPOINT); 1350 + } 1351 + 1352 + bool bpf_program__is_kprobe(struct bpf_program *prog) 1353 + { 1354 + return bpf_program__is_type(prog, BPF_PROG_TYPE_KPROBE); 1318 1355 } 1319 1356 1320 1357 int bpf_map__fd(struct bpf_map *map)
+9
tools/lib/bpf/libbpf.h
··· 165 165 int bpf_program__nth_fd(struct bpf_program *prog, int n); 166 166 167 167 /* 168 + * Adjust type of bpf program. Default is kprobe. 169 + */ 170 + int bpf_program__set_tracepoint(struct bpf_program *prog); 171 + int bpf_program__set_kprobe(struct bpf_program *prog); 172 + 173 + bool bpf_program__is_tracepoint(struct bpf_program *prog); 174 + bool bpf_program__is_kprobe(struct bpf_program *prog); 175 + 176 + /* 168 177 * We don't need __attribute__((packed)) now since it is 169 178 * unnecessary for 'bpf_map_def' because they are all aligned. 170 179 * In addition, using it will trigger -Wpacked warning message,