aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2019-02-12 03:20:39 -0500
committerDaniel Borkmann <daniel@iogearbox.net>2019-02-12 11:07:09 -0500
commitdd27c2e3d0a05c01ff14bb672d1a3f0fdd8f98fc (patch)
tree42041b30b1d27545ac6fde1849cf0044194f1e2a
parentebbed0f46ed9d3ae23291d67cd52d18abb8501bc (diff)
bpf: offload: add priv field for drivers
Currently bpf_offload_dev does not have any priv pointer, forcing the drivers to work backwards from the netdev in program metadata. This is not great given programs are conceptually associated with the offload device, and it means one or two unnecessary deferences. Add a priv pointer to bpf_offload_dev. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/main.c2
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/offload.c4
-rw-r--r--drivers/net/netdevsim/bpf.c5
-rw-r--r--include/linux/bpf.h3
-rw-r--r--kernel/bpf/offload.c10
5 files changed, 16 insertions, 8 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c
index dccae0319204..275de9f4c61c 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c
@@ -465,7 +465,7 @@ static int nfp_bpf_init(struct nfp_app *app)
465 app->ctrl_mtu = nfp_bpf_ctrl_cmsg_mtu(bpf); 465 app->ctrl_mtu = nfp_bpf_ctrl_cmsg_mtu(bpf);
466 } 466 }
467 467
468 bpf->bpf_dev = bpf_offload_dev_create(&nfp_bpf_dev_ops); 468 bpf->bpf_dev = bpf_offload_dev_create(&nfp_bpf_dev_ops, bpf);
469 err = PTR_ERR_OR_ZERO(bpf->bpf_dev); 469 err = PTR_ERR_OR_ZERO(bpf->bpf_dev);
470 if (err) 470 if (err)
471 goto err_free_neutral_maps; 471 goto err_free_neutral_maps;
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c
index 55c7dbf8b421..15dce97650a5 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c
@@ -185,8 +185,6 @@ static void nfp_prog_free(struct nfp_prog *nfp_prog)
185 185
186static int nfp_bpf_verifier_prep(struct bpf_prog *prog) 186static int nfp_bpf_verifier_prep(struct bpf_prog *prog)
187{ 187{
188 struct nfp_net *nn = netdev_priv(prog->aux->offload->netdev);
189 struct nfp_app *app = nn->app;
190 struct nfp_prog *nfp_prog; 188 struct nfp_prog *nfp_prog;
191 int ret; 189 int ret;
192 190
@@ -197,7 +195,7 @@ static int nfp_bpf_verifier_prep(struct bpf_prog *prog)
197 195
198 INIT_LIST_HEAD(&nfp_prog->insns); 196 INIT_LIST_HEAD(&nfp_prog->insns);
199 nfp_prog->type = prog->type; 197 nfp_prog->type = prog->type;
200 nfp_prog->bpf = app->priv; 198 nfp_prog->bpf = bpf_offload_dev_priv(prog->aux->offload->offdev);
201 199
202 ret = nfp_prog_prepare(nfp_prog, prog->insnsi, prog->len); 200 ret = nfp_prog_prepare(nfp_prog, prog->insnsi, prog->len);
203 if (ret) 201 if (ret)
diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c
index 172b271c8bd2..f92c43453ec6 100644
--- a/drivers/net/netdevsim/bpf.c
+++ b/drivers/net/netdevsim/bpf.c
@@ -248,7 +248,7 @@ static int nsim_bpf_create_prog(struct netdevsim *ns, struct bpf_prog *prog)
248 248
249static int nsim_bpf_verifier_prep(struct bpf_prog *prog) 249static int nsim_bpf_verifier_prep(struct bpf_prog *prog)
250{ 250{
251 struct netdevsim *ns = netdev_priv(prog->aux->offload->netdev); 251 struct netdevsim *ns = bpf_offload_dev_priv(prog->aux->offload->offdev);
252 252
253 if (!ns->bpf_bind_accept) 253 if (!ns->bpf_bind_accept)
254 return -EOPNOTSUPP; 254 return -EOPNOTSUPP;
@@ -589,7 +589,8 @@ int nsim_bpf_init(struct netdevsim *ns)
589 if (IS_ERR_OR_NULL(ns->sdev->ddir_bpf_bound_progs)) 589 if (IS_ERR_OR_NULL(ns->sdev->ddir_bpf_bound_progs))
590 return -ENOMEM; 590 return -ENOMEM;
591 591
592 ns->sdev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops); 592 ns->sdev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops,
593 ns);
593 err = PTR_ERR_OR_ZERO(ns->sdev->bpf_dev); 594 err = PTR_ERR_OR_ZERO(ns->sdev->bpf_dev);
594 if (err) 595 if (err)
595 return err; 596 return err;
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 7f58828755fd..de18227b3d95 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -773,8 +773,9 @@ int bpf_map_offload_get_next_key(struct bpf_map *map,
773bool bpf_offload_prog_map_match(struct bpf_prog *prog, struct bpf_map *map); 773bool bpf_offload_prog_map_match(struct bpf_prog *prog, struct bpf_map *map);
774 774
775struct bpf_offload_dev * 775struct bpf_offload_dev *
776bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops); 776bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops, void *priv);
777void bpf_offload_dev_destroy(struct bpf_offload_dev *offdev); 777void bpf_offload_dev_destroy(struct bpf_offload_dev *offdev);
778void *bpf_offload_dev_priv(struct bpf_offload_dev *offdev);
778int bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev, 779int bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev,
779 struct net_device *netdev); 780 struct net_device *netdev);
780void bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev, 781void bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev,
diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c
index 39dba8c90331..ba635209ae9a 100644
--- a/kernel/bpf/offload.c
+++ b/kernel/bpf/offload.c
@@ -35,6 +35,7 @@ static DECLARE_RWSEM(bpf_devs_lock);
35struct bpf_offload_dev { 35struct bpf_offload_dev {
36 const struct bpf_prog_offload_ops *ops; 36 const struct bpf_prog_offload_ops *ops;
37 struct list_head netdevs; 37 struct list_head netdevs;
38 void *priv;
38}; 39};
39 40
40struct bpf_offload_netdev { 41struct bpf_offload_netdev {
@@ -669,7 +670,7 @@ unlock:
669EXPORT_SYMBOL_GPL(bpf_offload_dev_netdev_unregister); 670EXPORT_SYMBOL_GPL(bpf_offload_dev_netdev_unregister);
670 671
671struct bpf_offload_dev * 672struct bpf_offload_dev *
672bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops) 673bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops, void *priv)
673{ 674{
674 struct bpf_offload_dev *offdev; 675 struct bpf_offload_dev *offdev;
675 int err; 676 int err;
@@ -688,6 +689,7 @@ bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops)
688 return ERR_PTR(-ENOMEM); 689 return ERR_PTR(-ENOMEM);
689 690
690 offdev->ops = ops; 691 offdev->ops = ops;
692 offdev->priv = priv;
691 INIT_LIST_HEAD(&offdev->netdevs); 693 INIT_LIST_HEAD(&offdev->netdevs);
692 694
693 return offdev; 695 return offdev;
@@ -700,3 +702,9 @@ void bpf_offload_dev_destroy(struct bpf_offload_dev *offdev)
700 kfree(offdev); 702 kfree(offdev);
701} 703}
702EXPORT_SYMBOL_GPL(bpf_offload_dev_destroy); 704EXPORT_SYMBOL_GPL(bpf_offload_dev_destroy);
705
706void *bpf_offload_dev_priv(struct bpf_offload_dev *offdev)
707{
708 return offdev->priv;
709}
710EXPORT_SYMBOL_GPL(bpf_offload_dev_priv);