aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuentin Monnet <quentin.monnet@netronome.com>2018-11-09 08:03:29 -0500
committerAlexei Starovoitov <ast@kernel.org>2018-11-10 18:39:54 -0500
commitb07ade27e93360197e453e5ca80eebdc9099dcb5 (patch)
tree051fca57e0151f163c9c061634065baa9625fea9
parent00db12c3d141356a4d1e6b6f688e0d5ed3b1f757 (diff)
bpf: pass translate() as a callback and remove its ndo_bpf subcommand
As part of the transition from ndo_bpf() to callbacks attached to struct bpf_offload_dev for some of the eBPF offload operations, move the functions related to code translation to the struct and remove the subcommand that was used to call them through the NDO. Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/offload.c11
-rw-r--r--drivers/net/netdevsim/bpf.c14
-rw-r--r--include/linux/bpf.h1
-rw-r--r--include/linux/netdevice.h3
-rw-r--r--kernel/bpf/offload.c14
5 files changed, 21 insertions, 22 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c
index 16a3a9c55852..8653a2189c19 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c
@@ -33,9 +33,6 @@ nfp_map_ptr_record(struct nfp_app_bpf *bpf, struct nfp_prog *nfp_prog,
33 struct nfp_bpf_neutral_map *record; 33 struct nfp_bpf_neutral_map *record;
34 int err; 34 int err;
35 35
36 /* Map record paths are entered via ndo, update side is protected. */
37 ASSERT_RTNL();
38
39 /* Reuse path - other offloaded program is already tracking this map. */ 36 /* Reuse path - other offloaded program is already tracking this map. */
40 record = rhashtable_lookup_fast(&bpf->maps_neutral, &map->id, 37 record = rhashtable_lookup_fast(&bpf->maps_neutral, &map->id,
41 nfp_bpf_maps_neutral_params); 38 nfp_bpf_maps_neutral_params);
@@ -84,8 +81,6 @@ nfp_map_ptrs_forget(struct nfp_app_bpf *bpf, struct nfp_prog *nfp_prog)
84 bool freed = false; 81 bool freed = false;
85 int i; 82 int i;
86 83
87 ASSERT_RTNL();
88
89 for (i = 0; i < nfp_prog->map_records_cnt; i++) { 84 for (i = 0; i < nfp_prog->map_records_cnt; i++) {
90 if (--nfp_prog->map_records[i]->count) { 85 if (--nfp_prog->map_records[i]->count) {
91 nfp_prog->map_records[i] = NULL; 86 nfp_prog->map_records[i] = NULL;
@@ -219,9 +214,10 @@ err_free:
219 return ret; 214 return ret;
220} 215}
221 216
222static int nfp_bpf_translate(struct nfp_net *nn, struct bpf_prog *prog) 217static int nfp_bpf_translate(struct net_device *netdev, struct bpf_prog *prog)
223{ 218{
224 struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv; 219 struct nfp_prog *nfp_prog = prog->aux->offload->dev_priv;
220 struct nfp_net *nn = netdev_priv(netdev);
225 unsigned int max_instr; 221 unsigned int max_instr;
226 int err; 222 int err;
227 223
@@ -422,8 +418,6 @@ nfp_bpf_map_free(struct nfp_app_bpf *bpf, struct bpf_offloaded_map *offmap)
422int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, struct netdev_bpf *bpf) 418int nfp_ndo_bpf(struct nfp_app *app, struct nfp_net *nn, struct netdev_bpf *bpf)
423{ 419{
424 switch (bpf->command) { 420 switch (bpf->command) {
425 case BPF_OFFLOAD_TRANSLATE:
426 return nfp_bpf_translate(nn, bpf->offload.prog);
427 case BPF_OFFLOAD_DESTROY: 421 case BPF_OFFLOAD_DESTROY:
428 return nfp_bpf_destroy(nn, bpf->offload.prog); 422 return nfp_bpf_destroy(nn, bpf->offload.prog);
429 case BPF_OFFLOAD_MAP_ALLOC: 423 case BPF_OFFLOAD_MAP_ALLOC:
@@ -604,4 +598,5 @@ const struct bpf_prog_offload_ops nfp_bpf_dev_ops = {
604 .insn_hook = nfp_verify_insn, 598 .insn_hook = nfp_verify_insn,
605 .finalize = nfp_bpf_finalize, 599 .finalize = nfp_bpf_finalize,
606 .prepare = nfp_bpf_verifier_prep, 600 .prepare = nfp_bpf_verifier_prep,
601 .translate = nfp_bpf_translate,
607}; 602};
diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c
index d045b7d666d9..30c2cd516d1c 100644
--- a/drivers/net/netdevsim/bpf.c
+++ b/drivers/net/netdevsim/bpf.c
@@ -269,6 +269,14 @@ nsim_bpf_verifier_prep(struct net_device *dev, struct bpf_verifier_env *env)
269 return nsim_bpf_create_prog(ns, env->prog); 269 return nsim_bpf_create_prog(ns, env->prog);
270} 270}
271 271
272static int nsim_bpf_translate(struct net_device *dev, struct bpf_prog *prog)
273{
274 struct nsim_bpf_bound_prog *state = prog->aux->offload->dev_priv;
275
276 state->state = "xlated";
277 return 0;
278}
279
272static void nsim_bpf_destroy_prog(struct bpf_prog *prog) 280static void nsim_bpf_destroy_prog(struct bpf_prog *prog)
273{ 281{
274 struct nsim_bpf_bound_prog *state; 282 struct nsim_bpf_bound_prog *state;
@@ -285,6 +293,7 @@ static const struct bpf_prog_offload_ops nsim_bpf_dev_ops = {
285 .insn_hook = nsim_bpf_verify_insn, 293 .insn_hook = nsim_bpf_verify_insn,
286 .finalize = nsim_bpf_finalize, 294 .finalize = nsim_bpf_finalize,
287 .prepare = nsim_bpf_verifier_prep, 295 .prepare = nsim_bpf_verifier_prep,
296 .translate = nsim_bpf_translate,
288}; 297};
289 298
290static int nsim_setup_prog_checks(struct netdevsim *ns, struct netdev_bpf *bpf) 299static int nsim_setup_prog_checks(struct netdevsim *ns, struct netdev_bpf *bpf)
@@ -551,11 +560,6 @@ int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf)
551 ASSERT_RTNL(); 560 ASSERT_RTNL();
552 561
553 switch (bpf->command) { 562 switch (bpf->command) {
554 case BPF_OFFLOAD_TRANSLATE:
555 state = bpf->offload.prog->aux->offload->dev_priv;
556
557 state->state = "xlated";
558 return 0;
559 case BPF_OFFLOAD_DESTROY: 563 case BPF_OFFLOAD_DESTROY:
560 nsim_bpf_destroy_prog(bpf->offload.prog); 564 nsim_bpf_destroy_prog(bpf->offload.prog);
561 return 0; 565 return 0;
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index f250494a4f56..d1eb3c8a3fa9 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -269,6 +269,7 @@ struct bpf_prog_offload_ops {
269 int insn_idx, int prev_insn_idx); 269 int insn_idx, int prev_insn_idx);
270 int (*finalize)(struct bpf_verifier_env *env); 270 int (*finalize)(struct bpf_verifier_env *env);
271 int (*prepare)(struct net_device *netdev, struct bpf_verifier_env *env); 271 int (*prepare)(struct net_device *netdev, struct bpf_verifier_env *env);
272 int (*translate)(struct net_device *netdev, struct bpf_prog *prog);
272}; 273};
273 274
274struct bpf_prog_offload { 275struct bpf_prog_offload {
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 0fa2c2744928..27499127e038 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -863,7 +863,6 @@ enum bpf_netdev_command {
863 XDP_QUERY_PROG, 863 XDP_QUERY_PROG,
864 XDP_QUERY_PROG_HW, 864 XDP_QUERY_PROG_HW,
865 /* BPF program for offload callbacks, invoked at program load time. */ 865 /* BPF program for offload callbacks, invoked at program load time. */
866 BPF_OFFLOAD_TRANSLATE,
867 BPF_OFFLOAD_DESTROY, 866 BPF_OFFLOAD_DESTROY,
868 BPF_OFFLOAD_MAP_ALLOC, 867 BPF_OFFLOAD_MAP_ALLOC,
869 BPF_OFFLOAD_MAP_FREE, 868 BPF_OFFLOAD_MAP_FREE,
@@ -890,7 +889,7 @@ struct netdev_bpf {
890 /* flags with which program was installed */ 889 /* flags with which program was installed */
891 u32 prog_flags; 890 u32 prog_flags;
892 }; 891 };
893 /* BPF_OFFLOAD_TRANSLATE, BPF_OFFLOAD_DESTROY */ 892 /* BPF_OFFLOAD_DESTROY */
894 struct { 893 struct {
895 struct bpf_prog *prog; 894 struct bpf_prog *prog;
896 } offload; 895 } offload;
diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index 1f7ac00a494d..ae0167366c12 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -219,14 +219,14 @@ void bpf_prog_offload_destroy(struct bpf_prog *prog)
219 219
220static int bpf_prog_offload_translate(struct bpf_prog *prog) 220static int bpf_prog_offload_translate(struct bpf_prog *prog)
221{ 221{
222 struct netdev_bpf data = {}; 222 struct bpf_prog_offload *offload;
223 int ret; 223 int ret = -ENODEV;
224
225 data.offload.prog = prog;
226 224
227 rtnl_lock(); 225 down_read(&bpf_devs_lock);
228 ret = __bpf_offload_ndo(prog, BPF_OFFLOAD_TRANSLATE, &data); 226 offload = prog->aux->offload;
229 rtnl_unlock(); 227 if (offload)
228 ret = offload->offdev->ops->translate(offload->netdev, prog);
229 up_read(&bpf_devs_lock);
230 230
231 return ret; 231 return ret;
232} 232}