forked from mirrors/linux
		
	skbuff: remove some unnecessary operation in skb_segment_list()
gro list uses skb_shinfo(skb)->frag_list to link two skb together, and NAPI_GRO_CB(p)->last->next is used when there are more skb, see skb_gro_receive_list(). gso expects that each segmented skb is linked together using skb->next, so only the first skb->next need to set to skb_shinfo(skb)-> frag_list when doing gso list segment. It is the same reason that nskb->next does not need to be set to list_skb before goto the error handling, because nskb->next already pointers to list_skb. And nskb is also the last skb at the end of loop, so remove tail variable and use nskb instead. Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									134639e9cc
								
							
						
					
					
						commit
						1ddc3229ad
					
				
					 1 changed files with 3 additions and 12 deletions
				
			
		| 
						 | 
					@ -3732,13 +3732,13 @@ struct sk_buff *skb_segment_list(struct sk_buff *skb,
 | 
				
			||||||
	unsigned int tnl_hlen = skb_tnl_header_len(skb);
 | 
						unsigned int tnl_hlen = skb_tnl_header_len(skb);
 | 
				
			||||||
	unsigned int delta_truesize = 0;
 | 
						unsigned int delta_truesize = 0;
 | 
				
			||||||
	unsigned int delta_len = 0;
 | 
						unsigned int delta_len = 0;
 | 
				
			||||||
	struct sk_buff *tail = NULL;
 | 
					 | 
				
			||||||
	struct sk_buff *nskb, *tmp;
 | 
						struct sk_buff *nskb, *tmp;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	skb_push(skb, -skb_network_offset(skb) + offset);
 | 
						skb_push(skb, -skb_network_offset(skb) + offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	skb_shinfo(skb)->frag_list = NULL;
 | 
						skb_shinfo(skb)->frag_list = NULL;
 | 
				
			||||||
 | 
						skb->next = list_skb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	do {
 | 
						do {
 | 
				
			||||||
		nskb = list_skb;
 | 
							nskb = list_skb;
 | 
				
			||||||
| 
						 | 
					@ -3756,17 +3756,8 @@ struct sk_buff *skb_segment_list(struct sk_buff *skb,
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!tail)
 | 
							if (unlikely(err))
 | 
				
			||||||
			skb->next = nskb;
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
			tail->next = nskb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (unlikely(err)) {
 | 
					 | 
				
			||||||
			nskb->next = list_skb;
 | 
					 | 
				
			||||||
			goto err_linearize;
 | 
								goto err_linearize;
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		tail = nskb;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		delta_len += nskb->len;
 | 
							delta_len += nskb->len;
 | 
				
			||||||
		delta_truesize += nskb->truesize;
 | 
							delta_truesize += nskb->truesize;
 | 
				
			||||||
| 
						 | 
					@ -3793,7 +3784,7 @@ struct sk_buff *skb_segment_list(struct sk_buff *skb,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	skb_gso_reset(skb);
 | 
						skb_gso_reset(skb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	skb->prev = tail;
 | 
						skb->prev = nskb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (skb_needs_linearize(skb, features) &&
 | 
						if (skb_needs_linearize(skb, features) &&
 | 
				
			||||||
	    __skb_linearize(skb))
 | 
						    __skb_linearize(skb))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue