ixgbe: implement flush flag for ndo_xdp_xmit
authorJesper Dangaard Brouer <brouer@redhat.com>
Thu, 31 May 2018 08:59:57 +0000 (10:59 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 3 Jun 2018 15:11:34 +0000 (08:11 -0700)
When passed the XDP_XMIT_FLUSH flag ixgbe_xdp_xmit now performs the
same kind of ring tail update as in ixgbe_xdp_flush.  The update tail
code in ixgbe_xdp_flush is generalized and shared with ixgbe_xdp_xmit.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index 87f088f4af52a7018b9c74cf3f63bd64bedc3808..4fd77c9067f2b6bc3b6764b3590d59f27b8b07c5 100644 (file)
@@ -10022,6 +10022,15 @@ static int ixgbe_xdp(struct net_device *dev, struct netdev_bpf *xdp)
        }
 }
 
+static void ixgbe_xdp_ring_update_tail(struct ixgbe_ring *ring)
+{
+       /* Force memory writes to complete before letting h/w know there
+        * are new descriptors to fetch.
+        */
+       wmb();
+       writel(ring->next_to_use, ring->tail);
+}
+
 static int ixgbe_xdp_xmit(struct net_device *dev, int n,
                          struct xdp_frame **frames, u32 flags)
 {
@@ -10033,7 +10042,7 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n,
        if (unlikely(test_bit(__IXGBE_DOWN, &adapter->state)))
                return -ENETDOWN;
 
-       if (unlikely(flags & ~XDP_XMIT_FLAGS_NONE))
+       if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
                return -EINVAL;
 
        /* During program transitions its possible adapter->xdp_prog is assigned
@@ -10054,6 +10063,9 @@ static int ixgbe_xdp_xmit(struct net_device *dev, int n,
                }
        }
 
+       if (unlikely(flags & XDP_XMIT_FLUSH))
+               ixgbe_xdp_ring_update_tail(ring);
+
        return n - drops;
 }
 
@@ -10072,11 +10084,7 @@ static void ixgbe_xdp_flush(struct net_device *dev)
        if (unlikely(!ring))
                return;
 
-       /* Force memory writes to complete before letting h/w know there
-        * are new descriptors to fetch.
-        */
-       wmb();
-       writel(ring->next_to_use, ring->tail);
+       ixgbe_xdp_ring_update_tail(ring);
 
        return;
 }