aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2017-06-21 18:25:06 -0700
committerDavid S. Miller <davem@davemloft.net>2017-06-23 13:42:19 -0400
commit9f82fca9422eab3877ab2b697ccc5eef44c63b54 (patch)
tree72464a7e9cf0d1e722a2cceb41ae9f37e1337beb /drivers/net/ethernet/netronome/nfp/nfp_net_common.c
parentnfp: xdp: move driver XDP setup into a separate function (diff)
downloadlinux-dev-9f82fca9422eab3877ab2b697ccc5eef44c63b54.tar.xz
linux-dev-9f82fca9422eab3877ab2b697ccc5eef44c63b54.zip
nfp: bpf: don't offload XDP programs in DRV_MODE
DRV_MODE means that user space wants the program to be run in the driver. Do not try to offload. Only offload if no mode flags have been specified. Remember what the mode is when the program is installed and refuse new setup requests if there is already a program loaded in a different mode. This should leave it open for us to implement simultaneous loading of two programs - one in the drv path and another to the NIC later. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '')
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_common.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index f2188b9c3628..9563615cf4b7 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -3311,16 +3311,23 @@ nfp_net_xdp_setup_drv(struct nfp_net *nn, struct bpf_prog *prog,
}
static int
-nfp_net_xdp_setup(struct nfp_net *nn, struct bpf_prog *prog,
+nfp_net_xdp_setup(struct nfp_net *nn, struct bpf_prog *prog, u32 flags,
struct netlink_ext_ack *extack)
{
+ struct bpf_prog *offload_prog;
int err;
+ if (nn->dp.xdp_prog && (flags ^ nn->xdp_flags) & XDP_FLAGS_MODES)
+ return -EBUSY;
+
+ offload_prog = flags & XDP_FLAGS_DRV_MODE ? NULL : prog;
+
err = nfp_net_xdp_setup_drv(nn, prog, extack);
if (err)
return err;
- nfp_app_xdp_offload(nn->app, nn, nn->dp.xdp_prog);
+ nfp_app_xdp_offload(nn->app, nn, offload_prog);
+ nn->xdp_flags = flags;
return 0;
}
@@ -3331,7 +3338,8 @@ static int nfp_net_xdp(struct net_device *netdev, struct netdev_xdp *xdp)
switch (xdp->command) {
case XDP_SETUP_PROG:
- return nfp_net_xdp_setup(nn, xdp->prog, xdp->extack);
+ return nfp_net_xdp_setup(nn, xdp->prog, xdp->flags,
+ xdp->extack);
case XDP_QUERY_PROG:
xdp->prog_attached = !!nn->dp.xdp_prog;
xdp->prog_id = nn->dp.xdp_prog ? nn->dp.xdp_prog->aux->id : 0;