Skip to content

Commit

Permalink
net: reclaim skb->scm_io_uring bit
Browse files Browse the repository at this point in the history
Commit 0091bfc ("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>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Mar 8, 2023
1 parent b3f4cd0 commit 1036908
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 5 deletions.
2 changes: 0 additions & 2 deletions include/linux/skbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,6 @@ typedef unsigned char *sk_buff_data_t;
* @csum_level: indicates the number of consecutive checksums found in
* the packet minus one that have been verified as
* CHECKSUM_UNNECESSARY (max 3)
* @scm_io_uring: SKB holds io_uring registered files
* @dst_pending_confirm: need to confirm neighbour
* @decrypted: Decrypted SKB
* @slow_gro: state present at GRO time, slower prepare step required
Expand Down Expand Up @@ -989,7 +988,6 @@ struct sk_buff {
#endif
__u8 slow_gro:1;
__u8 csum_not_inet:1;
__u8 scm_io_uring:1;

#ifdef CONFIG_NET_SCHED
__u16 tc_index; /* traffic control index */
Expand Down
1 change: 1 addition & 0 deletions include/net/af_unix.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
void unix_inflight(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 io_uring_destruct_scm(struct sk_buff *skb);
void unix_gc(void);
void wait_for_unix_gc(void);
struct sock *unix_get_socket(struct file *filp);
Expand Down
3 changes: 1 addition & 2 deletions io_uring/rsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,8 +867,7 @@ int __io_scm_file_account(struct io_ring_ctx *ctx, struct file *file)

UNIXCB(skb).fp = fpl;
skb->sk = sk;
skb->scm_io_uring = 1;
skb->destructor = unix_destruct_scm;
skb->destructor = io_uring_destruct_scm;
refcount_add(skb->truesize, &sk->sk_wmem_alloc);
}

Expand Down
2 changes: 1 addition & 1 deletion net/unix/garbage.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ void unix_gc(void)
* release.path eventually putting registered files.
*/
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_queue_tail(&skb->sk->sk_receive_queue, skb);
}
Expand Down
6 changes: 6 additions & 0 deletions net/unix/scm.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,3 +152,9 @@ void unix_destruct_scm(struct sk_buff *skb)
sock_wfree(skb);
}
EXPORT_SYMBOL(unix_destruct_scm);

void io_uring_destruct_scm(struct sk_buff *skb)
{
unix_destruct_scm(skb);
}
EXPORT_SYMBOL(io_uring_destruct_scm);

0 comments on commit 1036908

Please sign in to comment.