diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_main.c | 45 | 
1 files changed, 32 insertions, 13 deletions
| diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 8e448288ee26..2f17f36e94fd 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -1718,24 +1718,26 @@ static void igc_add_rx_frag(struct igc_ring *rx_ring,  static struct sk_buff *igc_build_skb(struct igc_ring *rx_ring,  				     struct igc_rx_buffer *rx_buffer, -				     union igc_adv_rx_desc *rx_desc, -				     unsigned int size) +				     struct xdp_buff *xdp)  { -	void *va = page_address(rx_buffer->page) + rx_buffer->page_offset; +	unsigned int size = xdp->data_end - xdp->data;  	unsigned int truesize = igc_get_rx_frame_truesize(rx_ring, size); +	unsigned int metasize = xdp->data - xdp->data_meta;  	struct sk_buff *skb;  	/* prefetch first cache line of first page */ -	net_prefetch(va); +	net_prefetch(xdp->data_meta);  	/* build an skb around the page buffer */ -	skb = build_skb(va - IGC_SKB_PAD, truesize); +	skb = napi_build_skb(xdp->data_hard_start, truesize);  	if (unlikely(!skb))  		return NULL;  	/* update pointers within the skb to store the data */ -	skb_reserve(skb, IGC_SKB_PAD); +	skb_reserve(skb, xdp->data - xdp->data_hard_start);  	__skb_put(skb, size); +	if (metasize) +		skb_metadata_set(skb, metasize);  	igc_rx_buffer_flip(rx_buffer, truesize);  	return skb; @@ -1746,6 +1748,7 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,  					 struct xdp_buff *xdp,  					 ktime_t timestamp)  { +	unsigned int metasize = xdp->data - xdp->data_meta;  	unsigned int size = xdp->data_end - xdp->data;  	unsigned int truesize = igc_get_rx_frame_truesize(rx_ring, size);  	void *va = xdp->data; @@ -1753,10 +1756,11 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,  	struct sk_buff *skb;  	/* prefetch first cache line of first page */ -	net_prefetch(va); +	net_prefetch(xdp->data_meta);  	/* allocate a skb to store the frags */ -	skb = napi_alloc_skb(&rx_ring->q_vector->napi, IGC_RX_HDR_LEN); +	skb = napi_alloc_skb(&rx_ring->q_vector->napi, +			     IGC_RX_HDR_LEN + metasize);  	if (unlikely(!skb))  		return NULL; @@ -1769,7 +1773,13 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring,  		headlen = eth_get_headlen(skb->dev, va, IGC_RX_HDR_LEN);  	/* align pull length to size of long to optimize memcpy performance */ -	memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); +	memcpy(__skb_put(skb, headlen + metasize), xdp->data_meta, +	       ALIGN(headlen + metasize, sizeof(long))); + +	if (metasize) { +		skb_metadata_set(skb, metasize); +		__skb_pull(skb, metasize); +	}  	/* update all of the pointers */  	size -= headlen; @@ -2231,7 +2241,7 @@ static int __igc_xdp_run_prog(struct igc_adapter *adapter,  		return IGC_XDP_REDIRECT;  		break;  	default: -		bpf_warn_invalid_xdp_action(act); +		bpf_warn_invalid_xdp_action(adapter->netdev, prog, act);  		fallthrough;  	case XDP_ABORTED:  out_failure: @@ -2354,7 +2364,8 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)  		if (!skb) {  			xdp_init_buff(&xdp, truesize, &rx_ring->xdp_rxq);  			xdp_prepare_buff(&xdp, pktbuf - igc_rx_offset(rx_ring), -					 igc_rx_offset(rx_ring) + pkt_offset, size, false); +					 igc_rx_offset(rx_ring) + pkt_offset, +					 size, true);  			skb = igc_xdp_run_prog(adapter, &xdp);  		} @@ -2378,7 +2389,7 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)  		} else if (skb)  			igc_add_rx_frag(rx_ring, rx_buffer, skb, size);  		else if (ring_uses_build_skb(rx_ring)) -			skb = igc_build_skb(rx_ring, rx_buffer, rx_desc, size); +			skb = igc_build_skb(rx_ring, rx_buffer, &xdp);  		else  			skb = igc_construct_skb(rx_ring, rx_buffer, &xdp,  						timestamp); @@ -2448,8 +2459,10 @@ static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,  	skb_reserve(skb, xdp->data_meta - xdp->data_hard_start);  	memcpy(__skb_put(skb, totalsize), xdp->data_meta, totalsize); -	if (metasize) +	if (metasize) {  		skb_metadata_set(skb, metasize); +		__skb_pull(skb, metasize); +	}  	return skb;  } @@ -5467,6 +5480,9 @@ static irqreturn_t igc_intr_msi(int irq, void *data)  			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	} +	if (icr & IGC_ICR_TS) +		igc_tsync_interrupt(adapter); +  	napi_schedule(&q_vector->napi);  	return IRQ_HANDLED; @@ -5510,6 +5526,9 @@ static irqreturn_t igc_intr(int irq, void *data)  			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	} +	if (icr & IGC_ICR_TS) +		igc_tsync_interrupt(adapter); +  	napi_schedule(&q_vector->napi);  	return IRQ_HANDLED; |