aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Borkmann <daniel@iogearbox.net>2018-01-16 19:15:07 -0500
committerDaniel Borkmann <daniel@iogearbox.net>2018-01-16 19:15:08 -0500
commitf2f742f425563d7f6991e510875e95287aed9d9b (patch)
treeeffbbab7241a7b203f123449f858517ba09bdb22
parent4c38f74c9186e2bc32789ddab3a95ed384c695d7 (diff)
parent74801e50d5b89329e6c02b8bd924a41234f76316 (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.c5
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/main.h1
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/verifier.c20
-rw-r--r--kernel/bpf/disasm.h4
-rw-r--r--kernel/bpf/offload.c4
-rw-r--r--tools/bpf/bpftool/Makefile2
-rw-r--r--tools/build/feature/Makefile2
-rw-r--r--tools/lib/bpf/libbpf.c2
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
2910bool nfp_bpf_supported_opcode(u8 code)
2911{
2912 return !!instr_cb[code];
2913}
2914
2910void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv) 2915void *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
325void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt); 325void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt);
326int nfp_bpf_jit(struct nfp_prog *prog); 326int nfp_bpf_jit(struct nfp_prog *prog);
327bool nfp_bpf_supported_opcode(u8 code);
327 328
328extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops; 329extern 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
30const char *func_id_name(int id); 30const char *func_id_name(int id);
31 31
32typedef void (*bpf_insn_print_t)(struct bpf_verifier_env *env, 32typedef __printf(2, 3) void (*bpf_insn_print_t)(struct bpf_verifier_env *env,
33 const char *, ...); 33 const char *, ...);
34typedef const char *(*bpf_insn_revmap_call_t)(void *private_data, 34typedef const char *(*bpf_insn_revmap_call_t)(void *private_data,
35 const struct bpf_insn *insn); 35 const struct bpf_insn *insn);
36typedef const char *(*bpf_insn_print_imm_t)(void *private_data, 36typedef 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
40CFLAGS += -O2 40CFLAGS += -O2
41CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wshadow 41CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wshadow
42CFLAGS += -D__EXPORTED_HEADERS__ -I$(srctree)/tools/include/uapi -I$(srctree)/tools/include -I$(srctree)/tools/lib/bpf -I$(srctree)/kernel/bpf/ 42CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ -I$(srctree)/tools/include/uapi -I$(srctree)/tools/include -I$(srctree)/tools/lib/bpf -I$(srctree)/kernel/bpf/
43CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' 43CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"'
44LIBS = -lelf -lbfd -lopcodes $(LIBBPF) 44LIBS = -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);
1803BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP); 1803BPF_PROG_TYPE_FNS(xdp, BPF_PROG_TYPE_XDP);
1804BPF_PROG_TYPE_FNS(perf_event, BPF_PROG_TYPE_PERF_EVENT); 1804BPF_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 }
1807static const struct { 1807static const struct {
1808 const char *sec; 1808 const char *sec;
1809 size_t len; 1809 size_t len;