net: reclaim skb->scm_io_uring bit
authorEric Dumazet <edumazet@google.com>
Tue, 7 Mar 2023 14:59:59 +0000 (14:59 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Mar 2023 13:21:47 +0000 (13:21 +0000)
Commit 0091bfc81741 ("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>
include/linux/skbuff.h
include/net/af_unix.h
io_uring/rsrc.c
net/unix/garbage.c
net/unix/scm.c

index ff7ad33..fe66101 100644 (file)
@@ -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
@@ -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 */
index 480fa57..45ebde5 100644 (file)
@@ -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);
index a59fc02..27ceda3 100644 (file)
@@ -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);
        }
 
index dc27635..2405f0f 100644 (file)
@@ -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);
                }
index aa27a02..f915288 100644 (file)
@@ -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);