aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2018-03-28 20:48:32 -0400
committerAlexei Starovoitov <ast@kernel.org>2018-03-28 22:36:13 -0400
commitbfee64deaa766ba88ff42fcbced82ad4ef6cb315 (patch)
treee1b6314ada6c2e4cbf8120afb4a18dec9f1e12a0
parent44d65a47aeabc40619ad6d1900e0f54e5b5145b8 (diff)
nfp: bpf: add map deletes from the datapath
Support calling map_delete_elem() FW helper from the datapath programs. For JIT checks and code are basically equivalent to map lookups. Similarly to other map helper key must be on the stack. Different pointer types are left for future extension. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jiong Wang <jiong.wang@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/jit.c4
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/main.c3
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/main.h2
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/verifier.c8
4 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c
index c63368fc28f6..d8df56087961 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c
@@ -2329,6 +2329,7 @@ static int call(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
2329 return adjust_head(nfp_prog, meta); 2329 return adjust_head(nfp_prog, meta);
2330 case BPF_FUNC_map_lookup_elem: 2330 case BPF_FUNC_map_lookup_elem:
2331 case BPF_FUNC_map_update_elem: 2331 case BPF_FUNC_map_update_elem:
2332 case BPF_FUNC_map_delete_elem:
2332 return map_call_stack_common(nfp_prog, meta); 2333 return map_call_stack_common(nfp_prog, meta);
2333 default: 2334 default:
2334 WARN_ONCE(1, "verifier allowed unsupported function\n"); 2335 WARN_ONCE(1, "verifier allowed unsupported function\n");
@@ -3216,6 +3217,9 @@ void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv)
3216 case BPF_FUNC_map_update_elem: 3217 case BPF_FUNC_map_update_elem:
3217 val = nfp_prog->bpf->helpers.map_update; 3218 val = nfp_prog->bpf->helpers.map_update;
3218 break; 3219 break;
3220 case BPF_FUNC_map_delete_elem:
3221 val = nfp_prog->bpf->helpers.map_delete;
3222 break;
3219 default: 3223 default:
3220 pr_err("relocation of unknown helper %d\n", 3224 pr_err("relocation of unknown helper %d\n",
3221 val); 3225 val);
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c
index db6940551b32..a7e217c5204f 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c
@@ -287,6 +287,9 @@ nfp_bpf_parse_cap_func(struct nfp_app_bpf *bpf, void __iomem *value, u32 length)
287 case BPF_FUNC_map_update_elem: 287 case BPF_FUNC_map_update_elem:
288 bpf->helpers.map_update = readl(&cap->func_addr); 288 bpf->helpers.map_update = readl(&cap->func_addr);
289 break; 289 break;
290 case BPF_FUNC_map_delete_elem:
291 bpf->helpers.map_delete = readl(&cap->func_addr);
292 break;
290 } 293 }
291 294
292 return 0; 295 return 0;
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h
index 0246bd88bff3..26bb491224b3 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/main.h
+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h
@@ -129,6 +129,7 @@ enum pkt_vec {
129 * @helpers: helper addressess for various calls 129 * @helpers: helper addressess for various calls
130 * @helpers.map_lookup: map lookup helper address 130 * @helpers.map_lookup: map lookup helper address
131 * @helpers.map_update: map update helper address 131 * @helpers.map_update: map update helper address
132 * @helpers.map_delete: map delete helper address
132 */ 133 */
133struct nfp_app_bpf { 134struct nfp_app_bpf {
134 struct nfp_app *app; 135 struct nfp_app *app;
@@ -164,6 +165,7 @@ struct nfp_app_bpf {
164 struct { 165 struct {
165 u32 map_lookup; 166 u32 map_lookup;
166 u32 map_update; 167 u32 map_update;
168 u32 map_delete;
167 } helpers; 169 } helpers;
168}; 170};
169 171
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
index 482a0ce6e755..7d67ffc897dd 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
@@ -201,6 +201,14 @@ nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct bpf_verifier_env *env,
201 !nfp_bpf_stack_arg_ok("map_update", env, reg3, NULL)) 201 !nfp_bpf_stack_arg_ok("map_update", env, reg3, NULL))
202 return -EOPNOTSUPP; 202 return -EOPNOTSUPP;
203 break; 203 break;
204
205 case BPF_FUNC_map_delete_elem:
206 if (!nfp_bpf_map_call_ok("map_delete", env, meta,
207 bpf->helpers.map_delete, reg1) ||
208 !nfp_bpf_stack_arg_ok("map_delete", env, reg2,
209 meta->func_id ? &meta->arg2 : NULL))
210 return -EOPNOTSUPP;
211 break;
204 default: 212 default:
205 pr_vlog(env, "unsupported function id: %d\n", func_id); 213 pr_vlog(env, "unsupported function id: %d\n", func_id);
206 return -EOPNOTSUPP; 214 return -EOPNOTSUPP;