mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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