diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_txrx_lib.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c index d1a7171e618b..784f2f9ebb2d 100644 --- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c @@ -260,7 +260,7 @@ static u32 ice_clean_xdp_irq(struct ice_tx_ring *xdp_ring)  			ready_frames = idx + cnt - ntc + 1;  	} -	if (!ready_frames) +	if (unlikely(!ready_frames))  		return 0;  	ret = ready_frames; @@ -322,17 +322,17 @@ int __ice_xmit_xdp_ring(struct xdp_buff *xdp, struct ice_tx_ring *xdp_ring)  	u32 frag = 0;  	free_space = ICE_DESC_UNUSED(xdp_ring); - -	if (ICE_DESC_UNUSED(xdp_ring) < ICE_RING_QUARTER(xdp_ring)) +	if (free_space < ICE_RING_QUARTER(xdp_ring))  		free_space += ice_clean_xdp_irq(xdp_ring); +	if (unlikely(!free_space)) +		goto busy; +  	if (unlikely(xdp_buff_has_frags(xdp))) {  		sinfo = xdp_get_shared_info_from_buff(xdp);  		nr_frags = sinfo->nr_frags; -		if (free_space < nr_frags + 1) { -			xdp_ring->ring_stats->tx_stats.tx_busy++; -			return ICE_XDP_CONSUMED; -		} +		if (free_space < nr_frags + 1) +			goto busy;  	}  	tx_desc = ICE_TX_DESC(xdp_ring, ntu); @@ -396,6 +396,11 @@ dma_unmap:  		ntu--;  	}  	return ICE_XDP_CONSUMED; + +busy: +	xdp_ring->ring_stats->tx_stats.tx_busy++; + +	return ICE_XDP_CONSUMED;  }  /**  | 
