diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 33 | 
1 files changed, 21 insertions, 12 deletions
| diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 878b31d534ec..a45cd2b416c8 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -8214,7 +8214,8 @@ static void igb_reuse_rx_page(struct igb_ring *rx_ring,  	new_buff->pagecnt_bias	= old_buff->pagecnt_bias;  } -static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer) +static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer, +				  int rx_buf_pgcnt)  {  	unsigned int pagecnt_bias = rx_buffer->pagecnt_bias;  	struct page *page = rx_buffer->page; @@ -8225,7 +8226,7 @@ static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer)  #if (PAGE_SIZE < 8192)  	/* if we are only owner of page we can reuse it */ -	if (unlikely((page_ref_count(page) - pagecnt_bias) > 1)) +	if (unlikely((rx_buf_pgcnt - pagecnt_bias) > 1))  		return false;  #else  #define IGB_LAST_OFFSET \ @@ -8301,9 +8302,10 @@ static struct sk_buff *igb_construct_skb(struct igb_ring *rx_ring,  		return NULL;  	if (unlikely(igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP))) { -		igb_ptp_rx_pktstamp(rx_ring->q_vector, xdp->data, skb); -		xdp->data += IGB_TS_HDR_LEN; -		size -= IGB_TS_HDR_LEN; +		if (!igb_ptp_rx_pktstamp(rx_ring->q_vector, xdp->data, skb)) { +			xdp->data += IGB_TS_HDR_LEN; +			size -= IGB_TS_HDR_LEN; +		}  	}  	/* Determine available headroom for copy */ @@ -8364,8 +8366,8 @@ static struct sk_buff *igb_build_skb(struct igb_ring *rx_ring,  	/* pull timestamp out of packet data */  	if (igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP)) { -		igb_ptp_rx_pktstamp(rx_ring->q_vector, skb->data, skb); -		__skb_pull(skb, IGB_TS_HDR_LEN); +		if (!igb_ptp_rx_pktstamp(rx_ring->q_vector, skb->data, skb)) +			__skb_pull(skb, IGB_TS_HDR_LEN);  	}  	/* update buffer offset */ @@ -8614,11 +8616,17 @@ static unsigned int igb_rx_offset(struct igb_ring *rx_ring)  }  static struct igb_rx_buffer *igb_get_rx_buffer(struct igb_ring *rx_ring, -					       const unsigned int size) +					       const unsigned int size, int *rx_buf_pgcnt)  {  	struct igb_rx_buffer *rx_buffer;  	rx_buffer = &rx_ring->rx_buffer_info[rx_ring->next_to_clean]; +	*rx_buf_pgcnt = +#if (PAGE_SIZE < 8192) +		page_count(rx_buffer->page); +#else +		0; +#endif  	prefetchw(rx_buffer->page);  	/* we are reusing so sync this buffer for CPU use */ @@ -8634,9 +8642,9 @@ static struct igb_rx_buffer *igb_get_rx_buffer(struct igb_ring *rx_ring,  }  static void igb_put_rx_buffer(struct igb_ring *rx_ring, -			      struct igb_rx_buffer *rx_buffer) +			      struct igb_rx_buffer *rx_buffer, int rx_buf_pgcnt)  { -	if (igb_can_reuse_rx_page(rx_buffer)) { +	if (igb_can_reuse_rx_page(rx_buffer, rx_buf_pgcnt)) {  		/* hand second half of page back to the ring */  		igb_reuse_rx_page(rx_ring, rx_buffer);  	} else { @@ -8664,6 +8672,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  	unsigned int xdp_xmit = 0;  	struct xdp_buff xdp;  	u32 frame_sz = 0; +	int rx_buf_pgcnt;  	/* Frame size depend on rx_ring setup when PAGE_SIZE=4K */  #if (PAGE_SIZE < 8192) @@ -8693,7 +8702,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  		 */  		dma_rmb(); -		rx_buffer = igb_get_rx_buffer(rx_ring, size); +		rx_buffer = igb_get_rx_buffer(rx_ring, size, &rx_buf_pgcnt);  		/* retrieve a buffer from the ring */  		if (!skb) { @@ -8736,7 +8745,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  			break;  		} -		igb_put_rx_buffer(rx_ring, rx_buffer); +		igb_put_rx_buffer(rx_ring, rx_buffer, rx_buf_pgcnt);  		cleaned_count++;  		/* fetch next buffer in frame if non-eop */ |