Next patches will introduce virtio_net XDP offloading. In that case
we need to manage offloaded and non-offload program. In order to make
it consistent this patch introduces use of XDP attachment helpers.

Signed-off-by: Prashant Bhole <prashantbhole.li...@gmail.com>
---
 drivers/net/virtio_net.c | 30 +++++++++++-------------------
 1 file changed, 11 insertions(+), 19 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index c8bbb1b90c1c..cee5c2b15c62 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -229,6 +229,8 @@ struct virtnet_info {
        struct failover *failover;
 
        struct bpf_prog __rcu *xdp_prog;
+
+       struct xdp_attachment_info xdp;
 };
 
 struct padded_vnet_hdr {
@@ -2398,15 +2400,19 @@ static int virtnet_restore_guest_offloads(struct 
virtnet_info *vi)
        return virtnet_set_guest_offloads(vi, offloads);
 }
 
-static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
-                          struct netlink_ext_ack *extack)
+static int virtnet_xdp_set(struct net_device *dev, struct netdev_bpf *bpf)
 {
        unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
+       struct netlink_ext_ack *extack = bpf->extack;
        struct virtnet_info *vi = netdev_priv(dev);
+       struct bpf_prog *prog = bpf->prog;
        struct bpf_prog *old_prog;
        u16 xdp_qp = 0, curr_qp;
        int i, err;
 
+       if (!xdp_attachment_flags_ok(&vi->xdp, bpf))
+               return -EBUSY;
+
        if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)
            && (virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO4) ||
                virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO6) ||
@@ -2478,8 +2484,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct 
bpf_prog *prog,
                }
        }
 
-       if (old_prog)
-               bpf_prog_put(old_prog);
+       xdp_attachment_setup(&vi->xdp, bpf);
 
        return 0;
 
@@ -2501,26 +2506,13 @@ static int virtnet_xdp_set(struct net_device *dev, 
struct bpf_prog *prog,
        return err;
 }
 
-static u32 virtnet_xdp_query(struct net_device *dev)
-{
-       struct virtnet_info *vi = netdev_priv(dev);
-       const struct bpf_prog *xdp_prog;
-
-       xdp_prog = rtnl_dereference(vi->xdp_prog);
-       if (xdp_prog)
-               return xdp_prog->aux->id;
-
-       return 0;
-}
-
 static int virtnet_xdp(struct net_device *dev, struct netdev_bpf *xdp)
 {
        switch (xdp->command) {
        case XDP_SETUP_PROG:
-               return virtnet_xdp_set(dev, xdp->prog, xdp->extack);
+               return virtnet_xdp_set(dev, xdp);
        case XDP_QUERY_PROG:
-               xdp->prog_id = virtnet_xdp_query(dev);
-               return 0;
+               return xdp_attachment_query(&vi->xdp, xdp);
        default:
                return -EINVAL;
        }
-- 
2.20.1


Reply via email to