forked from mirrors/linux
		
	sk_buff: drop all skb extensions on free and skb scrubbing
Now that we have a 3rd extension, add a new helper that drops the
extension space and use it when we need to scrub an sk_buff.
At this time, scrubbing clears secpath and bridge netfilter data, but
retains the tc skb extension, after this patch all three get cleared.
NAPI reuse/free assumes we can only have a secpath attached to skb, but
it seems better to clear all extensions there as well.
v2: add unlikely hint (Eric Dumazet)
Fixes: 95a7233c45 ("net: openvswitch: Set OvS recirc_id from tc chain index")
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									6b3656a60f
								
							
						
					
					
						commit
						174e23810c
					
				
					 3 changed files with 12 additions and 3 deletions
				
			
		|  | @ -4144,8 +4144,17 @@ static inline void *skb_ext_find(const struct sk_buff *skb, enum skb_ext_id id) | ||||||
| 
 | 
 | ||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static inline void skb_ext_reset(struct sk_buff *skb) | ||||||
|  | { | ||||||
|  | 	if (unlikely(skb->active_extensions)) { | ||||||
|  | 		__skb_ext_put(skb->extensions); | ||||||
|  | 		skb->active_extensions = 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| #else | #else | ||||||
| static inline void skb_ext_put(struct sk_buff *skb) {} | static inline void skb_ext_put(struct sk_buff *skb) {} | ||||||
|  | static inline void skb_ext_reset(struct sk_buff *skb) {} | ||||||
| static inline void skb_ext_del(struct sk_buff *skb, int unused) {} | static inline void skb_ext_del(struct sk_buff *skb, int unused) {} | ||||||
| static inline void __skb_ext_copy(struct sk_buff *d, const struct sk_buff *s) {} | static inline void __skb_ext_copy(struct sk_buff *d, const struct sk_buff *s) {} | ||||||
| static inline void skb_ext_copy(struct sk_buff *dst, const struct sk_buff *s) {} | static inline void skb_ext_copy(struct sk_buff *dst, const struct sk_buff *s) {} | ||||||
|  |  | ||||||
|  | @ -5666,7 +5666,7 @@ EXPORT_SYMBOL(gro_find_complete_by_type); | ||||||
| static void napi_skb_free_stolen_head(struct sk_buff *skb) | static void napi_skb_free_stolen_head(struct sk_buff *skb) | ||||||
| { | { | ||||||
| 	skb_dst_drop(skb); | 	skb_dst_drop(skb); | ||||||
| 	secpath_reset(skb); | 	skb_ext_put(skb); | ||||||
| 	kmem_cache_free(skbuff_head_cache, skb); | 	kmem_cache_free(skbuff_head_cache, skb); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -5733,7 +5733,7 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) | ||||||
| 	skb->encapsulation = 0; | 	skb->encapsulation = 0; | ||||||
| 	skb_shinfo(skb)->gso_type = 0; | 	skb_shinfo(skb)->gso_type = 0; | ||||||
| 	skb->truesize = SKB_TRUESIZE(skb_end_offset(skb)); | 	skb->truesize = SKB_TRUESIZE(skb_end_offset(skb)); | ||||||
| 	secpath_reset(skb); | 	skb_ext_reset(skb); | ||||||
| 
 | 
 | ||||||
| 	napi->skb = skb; | 	napi->skb = skb; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5119,7 +5119,7 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet) | ||||||
| 	skb->skb_iif = 0; | 	skb->skb_iif = 0; | ||||||
| 	skb->ignore_df = 0; | 	skb->ignore_df = 0; | ||||||
| 	skb_dst_drop(skb); | 	skb_dst_drop(skb); | ||||||
| 	secpath_reset(skb); | 	skb_ext_reset(skb); | ||||||
| 	nf_reset(skb); | 	nf_reset(skb); | ||||||
| 	nf_reset_trace(skb); | 	nf_reset_trace(skb); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Florian Westphal
						Florian Westphal