]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
nfp: bpf: add map deletes from the datapath
authorJakub Kicinski <jakub.kicinski@netronome.com>
Thu, 29 Mar 2018 00:48:32 +0000 (17:48 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 29 Mar 2018 02:36:13 +0000 (19:36 -0700)
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>
drivers/net/ethernet/netronome/nfp/bpf/jit.c
drivers/net/ethernet/netronome/nfp/bpf/main.c
drivers/net/ethernet/netronome/nfp/bpf/main.h
drivers/net/ethernet/netronome/nfp/bpf/verifier.c

index c63368fc28f6ac4b08626a5e8aebaea334d2e702..d8df56087961bfc2818e28a94c28437e111a5245 100644 (file)
@@ -2329,6 +2329,7 @@ static int call(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
                return adjust_head(nfp_prog, meta);
        case BPF_FUNC_map_lookup_elem:
        case BPF_FUNC_map_update_elem:
+       case BPF_FUNC_map_delete_elem:
                return map_call_stack_common(nfp_prog, meta);
        default:
                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)
                        case BPF_FUNC_map_update_elem:
                                val = nfp_prog->bpf->helpers.map_update;
                                break;
+                       case BPF_FUNC_map_delete_elem:
+                               val = nfp_prog->bpf->helpers.map_delete;
+                               break;
                        default:
                                pr_err("relocation of unknown helper %d\n",
                                       val);
index db6940551b3261a54ddf8231c6951b9559657848..a7e217c5204f166420df6b33c5a0a19d0463c42e 100644 (file)
@@ -287,6 +287,9 @@ nfp_bpf_parse_cap_func(struct nfp_app_bpf *bpf, void __iomem *value, u32 length)
        case BPF_FUNC_map_update_elem:
                bpf->helpers.map_update = readl(&cap->func_addr);
                break;
+       case BPF_FUNC_map_delete_elem:
+               bpf->helpers.map_delete = readl(&cap->func_addr);
+               break;
        }
 
        return 0;
index 0246bd88bff34204d81ba6682cde4727d551edc1..26bb491224b3fd290ff4c0db44eee90594077496 100644 (file)
@@ -129,6 +129,7 @@ enum pkt_vec {
  * @helpers:           helper addressess for various calls
  * @helpers.map_lookup:                map lookup helper address
  * @helpers.map_update:                map update helper address
+ * @helpers.map_delete:                map delete helper address
  */
 struct nfp_app_bpf {
        struct nfp_app *app;
@@ -164,6 +165,7 @@ struct nfp_app_bpf {
        struct {
                u32 map_lookup;
                u32 map_update;
+               u32 map_delete;
        } helpers;
 };
 
index 482a0ce6e75544bacc3c02231bd90a727e95a902..7d67ffc897dd26f142b04d17dc789c97c2a91737 100644 (file)
@@ -201,6 +201,14 @@ nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct bpf_verifier_env *env,
                    !nfp_bpf_stack_arg_ok("map_update", env, reg3, NULL))
                        return -EOPNOTSUPP;
                break;
+
+       case BPF_FUNC_map_delete_elem:
+               if (!nfp_bpf_map_call_ok("map_delete", env, meta,
+                                        bpf->helpers.map_delete, reg1) ||
+                   !nfp_bpf_stack_arg_ok("map_delete", env, reg2,
+                                         meta->func_id ? &meta->arg2 : NULL))
+                       return -EOPNOTSUPP;
+               break;
        default:
                pr_vlog(env, "unsupported function id: %d\n", func_id);
                return -EOPNOTSUPP;