gro: Change all receive functions to return GRO result codes
This will allow drivers to adjust their receive path dynamically based on whether GRO is being applied successfully. Currently all in-tree callers ignore the return values of these functions and do not need to be changed. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								5b252f0c2f
							
						
					
				
			
			
				commit
				
					
						c7c4b3b6e9
					
				
			
		
					 4 changed files with 42 additions and 45 deletions
				
			
		|  | @ -120,9 +120,11 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev); | ||||||
| extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | ||||||
| 			     u16 vlan_tci, int polling); | 			     u16 vlan_tci, int polling); | ||||||
| extern int vlan_hwaccel_do_receive(struct sk_buff *skb); | extern int vlan_hwaccel_do_receive(struct sk_buff *skb); | ||||||
| extern int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | extern gro_result_t | ||||||
|  | vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | ||||||
| 		 unsigned int vlan_tci, struct sk_buff *skb); | 		 unsigned int vlan_tci, struct sk_buff *skb); | ||||||
| extern int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | extern gro_result_t | ||||||
|  | vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | ||||||
| 	       unsigned int vlan_tci); | 	       unsigned int vlan_tci); | ||||||
| 
 | 
 | ||||||
| #else | #else | ||||||
|  | @ -150,17 +152,18 @@ static inline int vlan_hwaccel_do_receive(struct sk_buff *skb) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline int vlan_gro_receive(struct napi_struct *napi, | static inline gro_result_t | ||||||
| 				   struct vlan_group *grp, | vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | ||||||
| 		 unsigned int vlan_tci, struct sk_buff *skb) | 		 unsigned int vlan_tci, struct sk_buff *skb) | ||||||
| { | { | ||||||
| 	return NET_RX_DROP; | 	return GRO_DROP; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline int vlan_gro_frags(struct napi_struct *napi, | static inline gro_result_t | ||||||
| 				 struct vlan_group *grp, unsigned int vlan_tci) | vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | ||||||
|  | 	       unsigned int vlan_tci) | ||||||
| { | { | ||||||
| 	return NET_RX_DROP; | 	return GRO_DROP; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1483,17 +1483,17 @@ extern int		netif_receive_skb(struct sk_buff *skb); | ||||||
| extern void		napi_gro_flush(struct napi_struct *napi); | extern void		napi_gro_flush(struct napi_struct *napi); | ||||||
| extern gro_result_t	dev_gro_receive(struct napi_struct *napi, | extern gro_result_t	dev_gro_receive(struct napi_struct *napi, | ||||||
| 					struct sk_buff *skb); | 					struct sk_buff *skb); | ||||||
| extern int		napi_skb_finish(gro_result_t ret, struct sk_buff *skb); | extern gro_result_t	napi_skb_finish(gro_result_t ret, struct sk_buff *skb); | ||||||
| extern int		napi_gro_receive(struct napi_struct *napi, | extern gro_result_t	napi_gro_receive(struct napi_struct *napi, | ||||||
| 					 struct sk_buff *skb); | 					 struct sk_buff *skb); | ||||||
| extern void		napi_reuse_skb(struct napi_struct *napi, | extern void		napi_reuse_skb(struct napi_struct *napi, | ||||||
| 				       struct sk_buff *skb); | 				       struct sk_buff *skb); | ||||||
| extern struct sk_buff *	napi_get_frags(struct napi_struct *napi); | extern struct sk_buff *	napi_get_frags(struct napi_struct *napi); | ||||||
| extern int		napi_frags_finish(struct napi_struct *napi, | extern gro_result_t	napi_frags_finish(struct napi_struct *napi, | ||||||
| 					  struct sk_buff *skb, | 					  struct sk_buff *skb, | ||||||
| 					  gro_result_t ret); | 					  gro_result_t ret); | ||||||
| extern struct sk_buff *	napi_frags_skb(struct napi_struct *napi); | extern struct sk_buff *	napi_frags_skb(struct napi_struct *napi); | ||||||
| extern int		napi_gro_frags(struct napi_struct *napi); | extern gro_result_t	napi_gro_frags(struct napi_struct *napi); | ||||||
| 
 | 
 | ||||||
| static inline void napi_free_frags(struct napi_struct *napi) | static inline void napi_free_frags(struct napi_struct *napi) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -102,11 +102,12 @@ drop: | ||||||
| 	return GRO_DROP; | 	return GRO_DROP; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | gro_result_t vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | ||||||
| 			      unsigned int vlan_tci, struct sk_buff *skb) | 			      unsigned int vlan_tci, struct sk_buff *skb) | ||||||
| { | { | ||||||
| 	if (netpoll_rx_on(skb)) | 	if (netpoll_rx_on(skb)) | ||||||
| 		return vlan_hwaccel_receive_skb(skb, grp, vlan_tci); | 		return vlan_hwaccel_receive_skb(skb, grp, vlan_tci) | ||||||
|  | 			? GRO_DROP : GRO_NORMAL; | ||||||
| 
 | 
 | ||||||
| 	skb_gro_reset_offset(skb); | 	skb_gro_reset_offset(skb); | ||||||
| 
 | 
 | ||||||
|  | @ -114,17 +115,18 @@ int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(vlan_gro_receive); | EXPORT_SYMBOL(vlan_gro_receive); | ||||||
| 
 | 
 | ||||||
| int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | gro_result_t vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | ||||||
| 			    unsigned int vlan_tci) | 			    unsigned int vlan_tci) | ||||||
| { | { | ||||||
| 	struct sk_buff *skb = napi_frags_skb(napi); | 	struct sk_buff *skb = napi_frags_skb(napi); | ||||||
| 
 | 
 | ||||||
| 	if (!skb) | 	if (!skb) | ||||||
| 		return NET_RX_DROP; | 		return GRO_DROP; | ||||||
| 
 | 
 | ||||||
| 	if (netpoll_rx_on(skb)) { | 	if (netpoll_rx_on(skb)) { | ||||||
| 		skb->protocol = eth_type_trans(skb, skb->dev); | 		skb->protocol = eth_type_trans(skb, skb->dev); | ||||||
| 		return vlan_hwaccel_receive_skb(skb, grp, vlan_tci); | 		return vlan_hwaccel_receive_skb(skb, grp, vlan_tci) | ||||||
|  | 			? GRO_DROP : GRO_NORMAL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return napi_frags_finish(napi, skb, | 	return napi_frags_finish(napi, skb, | ||||||
|  |  | ||||||
|  | @ -2586,18 +2586,15 @@ __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | ||||||
| 	return dev_gro_receive(napi, skb); | 	return dev_gro_receive(napi, skb); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int napi_skb_finish(gro_result_t ret, struct sk_buff *skb) | gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb) | ||||||
| { | { | ||||||
| 	int err = NET_RX_SUCCESS; |  | ||||||
| 
 |  | ||||||
| 	switch (ret) { | 	switch (ret) { | ||||||
| 	case GRO_NORMAL: | 	case GRO_NORMAL: | ||||||
| 		return netif_receive_skb(skb); | 		if (netif_receive_skb(skb)) | ||||||
|  | 			ret = GRO_DROP; | ||||||
|  | 		break; | ||||||
| 
 | 
 | ||||||
| 	case GRO_DROP: | 	case GRO_DROP: | ||||||
| 		err = NET_RX_DROP; |  | ||||||
| 		/* fall through */ |  | ||||||
| 
 |  | ||||||
| 	case GRO_MERGED_FREE: | 	case GRO_MERGED_FREE: | ||||||
| 		kfree_skb(skb); | 		kfree_skb(skb); | ||||||
| 		break; | 		break; | ||||||
|  | @ -2607,7 +2604,7 @@ int napi_skb_finish(gro_result_t ret, struct sk_buff *skb) | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return err; | 	return ret; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(napi_skb_finish); | EXPORT_SYMBOL(napi_skb_finish); | ||||||
| 
 | 
 | ||||||
|  | @ -2627,7 +2624,7 @@ void skb_gro_reset_offset(struct sk_buff *skb) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(skb_gro_reset_offset); | EXPORT_SYMBOL(skb_gro_reset_offset); | ||||||
| 
 | 
 | ||||||
| int 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_gro_reset_offset(skb); | 	skb_gro_reset_offset(skb); | ||||||
| 
 | 
 | ||||||
|  | @ -2657,26 +2654,21 @@ struct sk_buff *napi_get_frags(struct napi_struct *napi) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(napi_get_frags); | EXPORT_SYMBOL(napi_get_frags); | ||||||
| 
 | 
 | ||||||
| int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, | gro_result_t napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, | ||||||
| 			       gro_result_t ret) | 			       gro_result_t ret) | ||||||
| { | { | ||||||
| 	int err = NET_RX_SUCCESS; |  | ||||||
| 
 |  | ||||||
| 	switch (ret) { | 	switch (ret) { | ||||||
| 	case GRO_NORMAL: | 	case GRO_NORMAL: | ||||||
| 	case GRO_HELD: | 	case GRO_HELD: | ||||||
| 		skb->protocol = eth_type_trans(skb, napi->dev); | 		skb->protocol = eth_type_trans(skb, napi->dev); | ||||||
| 
 | 
 | ||||||
| 		if (ret == GRO_NORMAL) | 		if (ret == GRO_HELD) | ||||||
| 			return netif_receive_skb(skb); |  | ||||||
| 
 |  | ||||||
| 			skb_gro_pull(skb, -ETH_HLEN); | 			skb_gro_pull(skb, -ETH_HLEN); | ||||||
|  | 		else if (netif_receive_skb(skb)) | ||||||
|  | 			ret = GRO_DROP; | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 	case GRO_DROP: | 	case GRO_DROP: | ||||||
| 		err = NET_RX_DROP; |  | ||||||
| 		/* fall through */ |  | ||||||
| 
 |  | ||||||
| 	case GRO_MERGED_FREE: | 	case GRO_MERGED_FREE: | ||||||
| 		napi_reuse_skb(napi, skb); | 		napi_reuse_skb(napi, skb); | ||||||
| 		break; | 		break; | ||||||
|  | @ -2685,7 +2677,7 @@ int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return err; | 	return ret; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(napi_frags_finish); | EXPORT_SYMBOL(napi_frags_finish); | ||||||
| 
 | 
 | ||||||
|  | @ -2726,12 +2718,12 @@ out: | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(napi_frags_skb); | EXPORT_SYMBOL(napi_frags_skb); | ||||||
| 
 | 
 | ||||||
| int napi_gro_frags(struct napi_struct *napi) | gro_result_t napi_gro_frags(struct napi_struct *napi) | ||||||
| { | { | ||||||
| 	struct sk_buff *skb = napi_frags_skb(napi); | 	struct sk_buff *skb = napi_frags_skb(napi); | ||||||
| 
 | 
 | ||||||
| 	if (!skb) | 	if (!skb) | ||||||
| 		return NET_RX_DROP; | 		return GRO_DROP; | ||||||
| 
 | 
 | ||||||
| 	return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb)); | 	return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb)); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ben Hutchings
				Ben Hutchings