forked from mirrors/linux
		
	net: reclaim skb->scm_io_uring bit
Commit 0091bfc817 ("io_uring/af_unix: defer registered
files gc to io_uring release") added one bit to struct sk_buff.
This structure is critical for networking, and we try very hard
to not add bloat on it, unless absolutely required.
For instance, we can use a specific destructor as a wrapper
around unix_destruct_scm(), to identify skbs that unix_gc()
has to special case.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Pavel Begunkov <asml.silence@gmail.com>
Cc: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Cc: Jens Axboe <axboe@kernel.dk>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Reviewed-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									b3f4cd07df
								
							
						
					
					
						commit
						1036908045
					
				
					 5 changed files with 9 additions and 5 deletions
				
			
		|  | @ -810,7 +810,6 @@ typedef unsigned char *sk_buff_data_t; | ||||||
|  *	@csum_level: indicates the number of consecutive checksums found in |  *	@csum_level: indicates the number of consecutive checksums found in | ||||||
|  *		the packet minus one that have been verified as |  *		the packet minus one that have been verified as | ||||||
|  *		CHECKSUM_UNNECESSARY (max 3) |  *		CHECKSUM_UNNECESSARY (max 3) | ||||||
|  *	@scm_io_uring: SKB holds io_uring registered files |  | ||||||
|  *	@dst_pending_confirm: need to confirm neighbour |  *	@dst_pending_confirm: need to confirm neighbour | ||||||
|  *	@decrypted: Decrypted SKB |  *	@decrypted: Decrypted SKB | ||||||
|  *	@slow_gro: state present at GRO time, slower prepare step required |  *	@slow_gro: state present at GRO time, slower prepare step required | ||||||
|  | @ -989,7 +988,6 @@ struct sk_buff { | ||||||
| #endif | #endif | ||||||
| 	__u8			slow_gro:1; | 	__u8			slow_gro:1; | ||||||
| 	__u8			csum_not_inet:1; | 	__u8			csum_not_inet:1; | ||||||
| 	__u8			scm_io_uring:1; |  | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_NET_SCHED | #ifdef CONFIG_NET_SCHED | ||||||
| 	__u16			tc_index;	/* traffic control index */ | 	__u16			tc_index;	/* traffic control index */ | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
| void unix_inflight(struct user_struct *user, struct file *fp); | void unix_inflight(struct user_struct *user, struct file *fp); | ||||||
| void unix_notinflight(struct user_struct *user, struct file *fp); | void unix_notinflight(struct user_struct *user, struct file *fp); | ||||||
| void unix_destruct_scm(struct sk_buff *skb); | void unix_destruct_scm(struct sk_buff *skb); | ||||||
|  | void io_uring_destruct_scm(struct sk_buff *skb); | ||||||
| void unix_gc(void); | void unix_gc(void); | ||||||
| void wait_for_unix_gc(void); | void wait_for_unix_gc(void); | ||||||
| struct sock *unix_get_socket(struct file *filp); | struct sock *unix_get_socket(struct file *filp); | ||||||
|  |  | ||||||
|  | @ -867,8 +867,7 @@ int __io_scm_file_account(struct io_ring_ctx *ctx, struct file *file) | ||||||
| 
 | 
 | ||||||
| 		UNIXCB(skb).fp = fpl; | 		UNIXCB(skb).fp = fpl; | ||||||
| 		skb->sk = sk; | 		skb->sk = sk; | ||||||
| 		skb->scm_io_uring = 1; | 		skb->destructor = io_uring_destruct_scm; | ||||||
| 		skb->destructor = unix_destruct_scm; |  | ||||||
| 		refcount_add(skb->truesize, &sk->sk_wmem_alloc); | 		refcount_add(skb->truesize, &sk->sk_wmem_alloc); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -305,7 +305,7 @@ void unix_gc(void) | ||||||
| 	 * release.path eventually putting registered files. | 	 * release.path eventually putting registered files. | ||||||
| 	 */ | 	 */ | ||||||
| 	skb_queue_walk_safe(&hitlist, skb, next_skb) { | 	skb_queue_walk_safe(&hitlist, skb, next_skb) { | ||||||
| 		if (skb->scm_io_uring) { | 		if (skb->destructor == io_uring_destruct_scm) { | ||||||
| 			__skb_unlink(skb, &hitlist); | 			__skb_unlink(skb, &hitlist); | ||||||
| 			skb_queue_tail(&skb->sk->sk_receive_queue, skb); | 			skb_queue_tail(&skb->sk->sk_receive_queue, skb); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -152,3 +152,9 @@ void unix_destruct_scm(struct sk_buff *skb) | ||||||
| 	sock_wfree(skb); | 	sock_wfree(skb); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(unix_destruct_scm); | EXPORT_SYMBOL(unix_destruct_scm); | ||||||
|  | 
 | ||||||
|  | void io_uring_destruct_scm(struct sk_buff *skb) | ||||||
|  | { | ||||||
|  | 	unix_destruct_scm(skb); | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(io_uring_destruct_scm); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet