diff options
author | Daniel Borkmann <daniel@iogearbox.net> | 2018-01-16 19:15:07 -0500 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2018-01-16 19:15:08 -0500 |
commit | f2f742f425563d7f6991e510875e95287aed9d9b (patch) | |
tree | effbbab7241a7b203f123449f858517ba09bdb22 | |
parent | 4c38f74c9186e2bc32789ddab3a95ed384c695d7 (diff) | |
parent | 74801e50d5b89329e6c02b8bd924a41234f76316 (diff) |
Merge branch 'bpf-various-improvements'
Jakub Kicinski says:
====================
This series combines a number of random improvements ranging from
libbpf to nfp driver. NFP patches make better use of the verifier
log. There is a requested adjustment to the map offload code, and
a warning fix for a W=1 build to the disassembler. Quentin also
fixes the libbpf program type detection, while Jiong allows the use
of libbfd compiled from source.
====================
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/bpf/jit.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/bpf/main.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/bpf/verifier.c | 20 | ||||
-rw-r--r-- | kernel/bpf/disasm.h | 4 | ||||
-rw-r--r-- | kernel/bpf/offload.c | 4 | ||||
-rw-r--r-- | tools/bpf/bpftool/Makefile | 2 | ||||
-rw-r--r-- | tools/build/feature/Makefile | 2 | ||||
-rw-r--r-- | tools/lib/bpf/libbpf.c | 2 |
8 files changed, 26 insertions, 14 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index cdc949fabe98..56451edf01c2 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c | |||
@@ -2907,6 +2907,11 @@ void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt) | |||
2907 | } | 2907 | } |
2908 | } | 2908 | } |
2909 | 2909 | ||
2910 | bool nfp_bpf_supported_opcode(u8 code) | ||
2911 | { | ||
2912 | return !!instr_cb[code]; | ||
2913 | } | ||
2914 | |||
2910 | void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv) | 2915 | void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv) |
2911 | { | 2916 | { |
2912 | unsigned int i; | 2917 | unsigned int i; |
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index b80e75a8ecda..c476bca15ba4 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h | |||
@@ -324,6 +324,7 @@ struct nfp_bpf_vnic { | |||
324 | 324 | ||
325 | void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt); | 325 | void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt); |
326 | int nfp_bpf_jit(struct nfp_prog *prog); | 326 | int nfp_bpf_jit(struct nfp_prog *prog); |
327 | bool nfp_bpf_supported_opcode(u8 code); | ||
327 | 328 | ||
328 | extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops; | 329 | extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops; |
329 | 330 | ||
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c index 741438896cc7..479f602887e9 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c | |||
@@ -132,22 +132,24 @@ nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct bpf_verifier_env *env, | |||
132 | 132 | ||
133 | case BPF_FUNC_map_lookup_elem: | 133 | case BPF_FUNC_map_lookup_elem: |
134 | if (!bpf->helpers.map_lookup) { | 134 | if (!bpf->helpers.map_lookup) { |
135 | pr_info("map_lookup: not supported by FW\n"); | 135 | pr_vlog(env, "map_lookup: not supported by FW\n"); |
136 | return -EOPNOTSUPP; | 136 | return -EOPNOTSUPP; |
137 | } | 137 | } |
138 | if (reg2->type != PTR_TO_STACK) { | 138 | if (reg2->type != PTR_TO_STACK) { |
139 | pr_info("map_lookup: unsupported key ptr type %d\n", | 139 | pr_vlog(env, |
140 | "map_lookup: unsupported key ptr type %d\n", | ||
140 | reg2->type); | 141 | reg2->type); |
141 | return -EOPNOTSUPP; | 142 | return -EOPNOTSUPP; |
142 | } | 143 | } |
143 | if (!tnum_is_const(reg2->var_off)) { | 144 | if (!tnum_is_const(reg2->var_off)) { |
144 | pr_info("map_lookup: variable key pointer\n"); | 145 | pr_vlog(env, "map_lookup: variable key pointer\n"); |
145 | return -EOPNOTSUPP; | 146 | return -EOPNOTSUPP; |
146 | } | 147 | } |
147 | 148 | ||
148 | off = reg2->var_off.value + reg2->off; | 149 | off = reg2->var_off.value + reg2->off; |
149 | if (-off % 4) { | 150 | if (-off % 4) { |
150 | pr_info("map_lookup: unaligned stack pointer %lld\n", | 151 | pr_vlog(env, |
152 | "map_lookup: unaligned stack pointer %lld\n", | ||
151 | -off); | 153 | -off); |
152 | return -EOPNOTSUPP; | 154 | return -EOPNOTSUPP; |
153 | } | 155 | } |
@@ -160,7 +162,7 @@ nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct bpf_verifier_env *env, | |||
160 | meta->arg2_var_off |= off != old_off; | 162 | meta->arg2_var_off |= off != old_off; |
161 | 163 | ||
162 | if (meta->arg1.map_ptr != reg1->map_ptr) { | 164 | if (meta->arg1.map_ptr != reg1->map_ptr) { |
163 | pr_info("map_lookup: called for different map\n"); | 165 | pr_vlog(env, "map_lookup: called for different map\n"); |
164 | return -EOPNOTSUPP; | 166 | return -EOPNOTSUPP; |
165 | } | 167 | } |
166 | break; | 168 | break; |
@@ -263,7 +265,7 @@ nfp_bpf_check_ptr(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, | |||
263 | 265 | ||
264 | if (reg->type == PTR_TO_MAP_VALUE) { | 266 | if (reg->type == PTR_TO_MAP_VALUE) { |
265 | if (is_mbpf_store(meta)) { | 267 | if (is_mbpf_store(meta)) { |
266 | pr_info("map writes not supported\n"); | 268 | pr_vlog(env, "map writes not supported\n"); |
267 | return -EOPNOTSUPP; | 269 | return -EOPNOTSUPP; |
268 | } | 270 | } |
269 | } | 271 | } |
@@ -288,6 +290,12 @@ nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx) | |||
288 | meta = nfp_bpf_goto_meta(nfp_prog, meta, insn_idx, env->prog->len); | 290 | meta = nfp_bpf_goto_meta(nfp_prog, meta, insn_idx, env->prog->len); |
289 | nfp_prog->verifier_meta = meta; | 291 | nfp_prog->verifier_meta = meta; |
290 | 292 | ||
293 | if (!nfp_bpf_supported_opcode(meta->insn.code)) { | ||
294 | pr_vlog(env, "instruction %#02x not supported\n", | ||
295 | meta->insn.code); | ||
296 | return -EINVAL; | ||
297 | } | ||
298 | |||
291 | if (meta->insn.src_reg >= MAX_BPF_REG || | 299 | if (meta->insn.src_reg >= MAX_BPF_REG || |
292 | meta->insn.dst_reg >= MAX_BPF_REG) { | 300 | meta->insn.dst_reg >= MAX_BPF_REG) { |
293 | pr_vlog(env, "program uses extended registers - jit hardening?\n"); | 301 | pr_vlog(env, "program uses extended registers - jit hardening?\n"); |
diff --git a/kernel/bpf/disasm.h b/kernel/bpf/disasm.h index e0857d016f89..266fe8ee542b 100644 --- a/kernel/bpf/disasm.h +++ b/kernel/bpf/disasm.h | |||
@@ -29,8 +29,8 @@ extern const char *const bpf_class_string[8]; | |||
29 | 29 | ||
30 | const char *func_id_name(int id); | 30 | const char *func_id_name(int id); |
31 | 31 | ||
32 | typedef void (*bpf_insn_print_t)(struct bpf_verifier_env *env, | 32 | typedef __printf(2, 3) void (*bpf_insn_print_t)(struct bpf_verifier_env *env, |
33 | const char *, ...); | 33 | const char *, ...); |
34 | typedef const char *(*bpf_insn_revmap_call_t)(void *private_data, | 34 | typedef const char *(*bpf_insn_revmap_call_t)(void *private_data, |
35 | const struct bpf_insn *insn); | 35 | const struct bpf_insn *insn); |
36 | typedef const char *(*bpf_insn_print_imm_t)(void *private_data, | 36 | typedef const char *(*bpf_insn_print_imm_t)(void *private_data, |
diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c index 453785fa1881..a88cebf368bf 100644 --- a/kernel/bpf/offload.c +++ b/kernel/bpf/offload.c | |||
@@ -395,10 +395,8 @@ bool bpf_offload_dev_match(struct bpf_prog *prog, struct bpf_map *map) | |||
395 | struct bpf_prog_offload *offload; | 395 | struct bpf_prog_offload *offload; |
396 | bool ret; | 396 | bool ret; |
397 | 397 | ||
398 | if (!!bpf_prog_is_dev_bound(prog->aux) != !!bpf_map_is_dev_bound(map)) | 398 | if (!bpf_prog_is_dev_bound(prog->aux) || !bpf_map_is_dev_bound(map)) |
399 | return false; | 399 | return false; |
400 | if (!bpf_prog_is_dev_bound(prog->aux)) | ||
401 | return true; | ||
402 | 400 | ||
403 | down_read(&bpf_devs_lock); | 401 | down_read(&bpf_devs_lock); |
404 | offload = prog->aux->offload; | 402 | offload = prog->aux->offload; |
diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile index 2237bc43f71c..26901ec87361 100644 --- a/tools/bpf/bpftool/Makefile +++ b/tools/bpf/bpftool/Makefile | |||
@@ -39,7 +39,7 @@ CC = gcc | |||
39 | 39 | ||
40 | CFLAGS += -O2 | 40 | CFLAGS += -O2 |
41 | CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wshadow | 41 | CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wshadow |
42 | CFLAGS += -D__EXPORTED_HEADERS__ -I$(srctree)/tools/include/uapi -I$(srctree)/tools/include -I$(srctree)/tools/lib/bpf -I$(srctree)/kernel/bpf/ | 42 | CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ -I$(srctree)/tools/include/uapi -I$(srctree)/tools/include -I$(srctree)/tools/lib/bpf -I$(srctree)/kernel/bpf/ |
43 | CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' | 43 | CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' |
44 | LIBS = -lelf -lbfd -lopcodes $(LIBBPF) | 44 | LIBS = -lelf -lbfd -lopcodes $(LIBBPF) |
45 | 45 | ||
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile index 17f2c73fff8b..bc715f6ac320 100644 --- a/tools/build/feature/Makefile +++ b/tools/build/feature/Makefile | |||
@@ -190,7 +190,7 @@ $(OUTPUT)test-libbfd.bin: | |||
190 | $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl | 190 | $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl |
191 | 191 | ||
192 | $(OUTPUT)test-disassembler-four-args.bin: | 192 | $(OUTPUT)test-disassembler-four-args.bin: |
193 | $(BUILD) -lbfd -lopcodes | 193 | $(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes |
194 | 194 | ||
195 | $(OUTPUT)test-liberty.bin: | 195 | $(OUTPUT)test-liberty.bin: |
196 | $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c -DPACKAGE='"perf"' $(LDFLAGS) -lbfd -ldl -liberty | 196 | $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c -DPACKAGE='"perf"' $(LDFLAGS) -lbfd -ldl -liberty |
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index e9c4b7cabcf2..30c776375118 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
@@ -1803,7 +1803,7 @@ BPF_PROG_TYPE_FNS(tracepoint, BPF_PROG_TYPE_TRACEPOINT); | |||
1803 | BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP); | 1803 | BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP); |
1804 | BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT); | 1804 | BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT); |
1805 | 1805 | ||
1806 | #define BPF_PROG_SEC(string, type) { string, sizeof(string), type } | 1806 | #define BPF_PROG_SEC(string, type) { string, sizeof(string) - 1, type } |
1807 | static const struct { | 1807 | static const struct { |
1808 | const char *sec; | 1808 | const char *sec; |
1809 | size_t len; | 1809 | size_t len; |