net: move skb_mark_napi_id() into core networking stack
We would like to automatically provide busy polling support to all NAPI drivers, without them having to implement anything. skb_mark_napi_id() can be called from napi_gro_receive() and napi_get_frags(). Few drivers are still calling skb_mark_napi_id() because they use netif_receive_skb(). They should eventually call napi_gro_receive() instead. I will leave this to drivers maintainers. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									868fdb0606
								
							
						
					
					
						commit
						93f93a4404
					
				| @ -2024,7 +2024,6 @@ read_again: | |||||||
| 		skb->dev = netdev; | 		skb->dev = netdev; | ||||||
| 		skb->protocol = eth_type_trans(skb, netdev); | 		skb->protocol = eth_type_trans(skb, netdev); | ||||||
| 		skb_record_rx_queue(skb, channel->queue_index); | 		skb_record_rx_queue(skb, channel->queue_index); | ||||||
| 		skb_mark_napi_id(skb, napi); |  | ||||||
| 
 | 
 | ||||||
| 		napi_gro_receive(napi, skb); | 		napi_gro_receive(napi, skb); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1094,8 +1094,6 @@ reuse_rx: | |||||||
| 			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), | 			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), | ||||||
| 					       le16_to_cpu(cqe_fp->vlan_tag)); | 					       le16_to_cpu(cqe_fp->vlan_tag)); | ||||||
| 
 | 
 | ||||||
| 		skb_mark_napi_id(skb, &fp->napi); |  | ||||||
| 
 |  | ||||||
| 		napi_gro_receive(&fp->napi, skb); | 		napi_gro_receive(&fp->napi, skb); | ||||||
| next_rx: | next_rx: | ||||||
| 		rx_buf->data = NULL; | 		rx_buf->data = NULL; | ||||||
|  | |||||||
| @ -1864,7 +1864,6 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl, | |||||||
| 	skb->truesize += skb->data_len; | 	skb->truesize += skb->data_len; | ||||||
| 	skb->ip_summed = CHECKSUM_UNNECESSARY; | 	skb->ip_summed = CHECKSUM_UNNECESSARY; | ||||||
| 	skb_record_rx_queue(skb, rxq->rspq.idx); | 	skb_record_rx_queue(skb, rxq->rspq.idx); | ||||||
| 	skb_mark_napi_id(skb, &rxq->rspq.napi); |  | ||||||
| 	pi = netdev_priv(skb->dev); | 	pi = netdev_priv(skb->dev); | ||||||
| 	if (pi->rxtstamp) | 	if (pi->rxtstamp) | ||||||
| 		cxgb4_sgetim_to_hwtstamp(adapter, skb_hwtstamps(skb), | 		cxgb4_sgetim_to_hwtstamp(adapter, skb_hwtstamps(skb), | ||||||
|  | |||||||
| @ -2184,7 +2184,6 @@ static void be_rx_compl_process_gro(struct be_rx_obj *rxo, | |||||||
| 		skb_set_hash(skb, rxcp->rss_hash, PKT_HASH_TYPE_L3); | 		skb_set_hash(skb, rxcp->rss_hash, PKT_HASH_TYPE_L3); | ||||||
| 
 | 
 | ||||||
| 	skb->csum_level = rxcp->tunneled; | 	skb->csum_level = rxcp->tunneled; | ||||||
| 	skb_mark_napi_id(skb, napi); |  | ||||||
| 
 | 
 | ||||||
| 	if (rxcp->vlanf) | 	if (rxcp->vlanf) | ||||||
| 		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rxcp->vlan_tag); | 		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rxcp->vlan_tag); | ||||||
|  | |||||||
| @ -1632,7 +1632,6 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget) | |||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
| 		skb_mark_napi_id(skb, &rx_ring->q_vector->napi); |  | ||||||
| 		i40e_receive_skb(rx_ring, skb, vlan_tag); | 		i40e_receive_skb(rx_ring, skb, vlan_tag); | ||||||
| 
 | 
 | ||||||
| 		rx_desc->wb.qword1.status_error_len = 0; | 		rx_desc->wb.qword1.status_error_len = 0; | ||||||
|  | |||||||
| @ -1090,7 +1090,6 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget) | |||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
| 		skb_mark_napi_id(skb, &rx_ring->q_vector->napi); |  | ||||||
| 		i40e_receive_skb(rx_ring, skb, vlan_tag); | 		i40e_receive_skb(rx_ring, skb, vlan_tag); | ||||||
| 
 | 
 | ||||||
| 		rx_desc->wb.qword1.status_error_len = 0; | 		rx_desc->wb.qword1.status_error_len = 0; | ||||||
|  | |||||||
| @ -1659,6 +1659,7 @@ static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring, | |||||||
| static void ixgbe_rx_skb(struct ixgbe_q_vector *q_vector, | static void ixgbe_rx_skb(struct ixgbe_q_vector *q_vector, | ||||||
| 			 struct sk_buff *skb) | 			 struct sk_buff *skb) | ||||||
| { | { | ||||||
|  | 	skb_mark_napi_id(skb, &q_vector->napi); | ||||||
| 	if (ixgbe_qv_busy_polling(q_vector)) | 	if (ixgbe_qv_busy_polling(q_vector)) | ||||||
| 		netif_receive_skb(skb); | 		netif_receive_skb(skb); | ||||||
| 	else | 	else | ||||||
| @ -2123,7 +2124,6 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| #endif /* IXGBE_FCOE */ | #endif /* IXGBE_FCOE */ | ||||||
| 		skb_mark_napi_id(skb, &q_vector->napi); |  | ||||||
| 		ixgbe_rx_skb(q_vector, skb); | 		ixgbe_rx_skb(q_vector, skb); | ||||||
| 
 | 
 | ||||||
| 		/* update budget accounting */ | 		/* update budget accounting */ | ||||||
|  | |||||||
| @ -925,7 +925,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud | |||||||
| 						PKT_HASH_TYPE_L3); | 						PKT_HASH_TYPE_L3); | ||||||
| 
 | 
 | ||||||
| 			skb_record_rx_queue(gro_skb, cq->ring); | 			skb_record_rx_queue(gro_skb, cq->ring); | ||||||
| 			skb_mark_napi_id(gro_skb, &cq->napi); |  | ||||||
| 
 | 
 | ||||||
| 			if (ring->hwtstamp_rx_filter == HWTSTAMP_FILTER_ALL) { | 			if (ring->hwtstamp_rx_filter == HWTSTAMP_FILTER_ALL) { | ||||||
| 				timestamp = mlx4_en_get_cqe_ts(cqe); | 				timestamp = mlx4_en_get_cqe_ts(cqe); | ||||||
| @ -988,8 +987,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud | |||||||
| 					       timestamp); | 					       timestamp); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		skb_mark_napi_id(skb, &cq->napi); |  | ||||||
| 
 |  | ||||||
| 		napi_gro_receive(&cq->napi, skb); | 		napi_gro_receive(&cq->napi, skb); | ||||||
| next: | next: | ||||||
| 		for (nr = 0; nr < priv->num_frags; nr++) | 		for (nr = 0; nr < priv->num_frags; nr++) | ||||||
|  | |||||||
| @ -243,7 +243,6 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget) | |||||||
| 		wqe            = mlx5_wq_ll_get_wqe(&rq->wq, wqe_counter); | 		wqe            = mlx5_wq_ll_get_wqe(&rq->wq, wqe_counter); | ||||||
| 		skb            = rq->skb[wqe_counter]; | 		skb            = rq->skb[wqe_counter]; | ||||||
| 		prefetch(skb->data); | 		prefetch(skb->data); | ||||||
| 		skb_mark_napi_id(skb, cq->napi); |  | ||||||
| 		rq->skb[wqe_counter] = NULL; | 		rq->skb[wqe_counter] = NULL; | ||||||
| 
 | 
 | ||||||
| 		dma_unmap_single(rq->pdev, | 		dma_unmap_single(rq->pdev, | ||||||
|  | |||||||
| @ -1488,7 +1488,6 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum) | |||||||
| 	} | 	} | ||||||
| 	myri10ge_vlan_rx(mgp->dev, va, skb); | 	myri10ge_vlan_rx(mgp->dev, va, skb); | ||||||
| 	skb_record_rx_queue(skb, ss - &mgp->ss[0]); | 	skb_record_rx_queue(skb, ss - &mgp->ss[0]); | ||||||
| 	skb_mark_napi_id(skb, &ss->napi); |  | ||||||
| 
 | 
 | ||||||
| 	if (polling) { | 	if (polling) { | ||||||
| 		int hlen; | 		int hlen; | ||||||
| @ -1506,6 +1505,7 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum) | |||||||
| 		skb->data_len -= hlen; | 		skb->data_len -= hlen; | ||||||
| 		skb->tail += hlen; | 		skb->tail += hlen; | ||||||
| 		skb->protocol = eth_type_trans(skb, dev); | 		skb->protocol = eth_type_trans(skb, dev); | ||||||
|  | 		skb_mark_napi_id(skb, &ss->napi); | ||||||
| 		netif_receive_skb(skb); | 		netif_receive_skb(skb); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
|  | |||||||
| @ -463,7 +463,6 @@ efx_rx_packet_gro(struct efx_channel *channel, struct efx_rx_buffer *rx_buf, | |||||||
| 
 | 
 | ||||||
| 	skb_record_rx_queue(skb, channel->rx_queue.core_index); | 	skb_record_rx_queue(skb, channel->rx_queue.core_index); | ||||||
| 
 | 
 | ||||||
| 	skb_mark_napi_id(skb, &channel->napi_str); |  | ||||||
| 	gro_result = napi_gro_frags(napi); | 	gro_result = napi_gro_frags(napi); | ||||||
| 	if (gro_result != GRO_DROP) | 	if (gro_result != GRO_DROP) | ||||||
| 		channel->irq_mod_score += 2; | 		channel->irq_mod_score += 2; | ||||||
|  | |||||||
| @ -516,8 +516,6 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, | |||||||
| 		skb_shinfo(skb)->gso_segs = 0; | 		skb_shinfo(skb)->gso_segs = 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	skb_mark_napi_id(skb, &rq->napi); |  | ||||||
| 
 |  | ||||||
| 	napi_gro_receive(&rq->napi, skb); | 	napi_gro_receive(&rq->napi, skb); | ||||||
| 	return; | 	return; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4356,6 +4356,7 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb) | |||||||
| 
 | 
 | ||||||
| gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | ||||||
| { | { | ||||||
|  | 	skb_mark_napi_id(skb, napi); | ||||||
| 	trace_napi_gro_receive_entry(skb); | 	trace_napi_gro_receive_entry(skb); | ||||||
| 
 | 
 | ||||||
| 	skb_gro_reset_offset(skb); | 	skb_gro_reset_offset(skb); | ||||||
| @ -4390,6 +4391,7 @@ struct sk_buff *napi_get_frags(struct napi_struct *napi) | |||||||
| 	if (!skb) { | 	if (!skb) { | ||||||
| 		skb = napi_alloc_skb(napi, GRO_MAX_HEAD); | 		skb = napi_alloc_skb(napi, GRO_MAX_HEAD); | ||||||
| 		napi->skb = skb; | 		napi->skb = skb; | ||||||
|  | 		skb_mark_napi_id(skb, napi); | ||||||
| 	} | 	} | ||||||
| 	return skb; | 	return skb; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user