diff options
Diffstat (limited to 'drivers/net/tun.c')
| -rw-r--r-- | drivers/net/tun.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index fc86da7f1628..6e55697315de 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1181,8 +1181,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,  	struct tun_struct *tun = netdev_priv(dev);  	struct tun_file *tfile;  	u32 numqueues; -	int drops = 0; -	int cnt = n; +	int nxmit = 0;  	int i;  	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) @@ -1212,9 +1211,9 @@ resample:  		if (__ptr_ring_produce(&tfile->tx_ring, frame)) {  			atomic_long_inc(&dev->tx_dropped); -			xdp_return_frame_rx_napi(xdp); -			drops++; +			break;  		} +		nxmit++;  	}  	spin_unlock(&tfile->tx_ring.producer_lock); @@ -1222,17 +1221,21 @@ resample:  		__tun_xdp_flush_tfile(tfile);  	rcu_read_unlock(); -	return cnt - drops; +	return nxmit;  }  static int tun_xdp_tx(struct net_device *dev, struct xdp_buff *xdp)  {  	struct xdp_frame *frame = xdp_convert_buff_to_frame(xdp); +	int nxmit;  	if (unlikely(!frame))  		return -EOVERFLOW; -	return tun_xdp_xmit(dev, 1, &frame, XDP_XMIT_FLUSH); +	nxmit = tun_xdp_xmit(dev, 1, &frame, XDP_XMIT_FLUSH); +	if (!nxmit) +		xdp_return_frame_rx_napi(frame); +	return nxmit;  }  static const struct net_device_ops tap_netdev_ops = {  |