Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[sfrench/cifs-2.6.git] / drivers / net / ethernet / amazon / ena / ena_netdev.c
index 102f2c91fdb855311e164186a2fddda0492f3ea2..5c062c51b4cb930adc349ba1863e6ecdf002bc11 100644 (file)
@@ -300,7 +300,7 @@ static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring,
 
        rc = ena_xdp_tx_map_frame(xdp_ring, tx_info, xdpf, &push_hdr, &push_len);
        if (unlikely(rc))
-               goto error_drop_packet;
+               return rc;
 
        ena_tx_ctx.ena_bufs = tx_info->bufs;
        ena_tx_ctx.push_header = push_hdr;
@@ -330,8 +330,6 @@ static int ena_xdp_xmit_frame(struct ena_ring *xdp_ring,
 error_unmap_dma:
        ena_unmap_tx_buff(xdp_ring, tx_info);
        tx_info->xdpf = NULL;
-error_drop_packet:
-       xdp_return_frame(xdpf);
        return rc;
 }
 
@@ -339,8 +337,8 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
                        struct xdp_frame **frames, u32 flags)
 {
        struct ena_adapter *adapter = netdev_priv(dev);
-       int qid, i, err, drops = 0;
        struct ena_ring *xdp_ring;
+       int qid, i, nxmit = 0;
 
        if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
                return -EINVAL;
@@ -360,12 +358,9 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
        spin_lock(&xdp_ring->xdp_tx_lock);
 
        for (i = 0; i < n; i++) {
-               err = ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0);
-               /* The descriptor is freed by ena_xdp_xmit_frame in case
-                * of an error.
-                */
-               if (err)
-                       drops++;
+               if (ena_xdp_xmit_frame(xdp_ring, dev, frames[i], 0))
+                       break;
+               nxmit++;
        }
 
        /* Ring doorbell to make device aware of the packets */
@@ -378,7 +373,7 @@ static int ena_xdp_xmit(struct net_device *dev, int n,
        spin_unlock(&xdp_ring->xdp_tx_lock);
 
        /* Return number of packets sent */
-       return n - drops;
+       return nxmit;
 }
 
 static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp)
@@ -415,7 +410,9 @@ static int ena_xdp_execute(struct ena_ring *rx_ring, struct xdp_buff *xdp)
                /* The XDP queues are shared between XDP_TX and XDP_REDIRECT */
                spin_lock(&xdp_ring->xdp_tx_lock);
 
-               ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf, XDP_XMIT_FLUSH);
+               if (ena_xdp_xmit_frame(xdp_ring, rx_ring->netdev, xdpf,
+                                      XDP_XMIT_FLUSH))
+                       xdp_return_frame(xdpf);
 
                spin_unlock(&xdp_ring->xdp_tx_lock);
                xdp_stat = &rx_ring->rx_stats.xdp_tx;