io_uring/rsrc: extract SCM file put helper
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 11 Apr 2023 11:06:08 +0000 (12:06 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 12 Apr 2023 18:09:41 +0000 (12:09 -0600)
SCM file accounting is a slow path and is only used for UNIX files.
Extract a helper out of io_rsrc_file_put() that does the SCM
unaccounting.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/58cc7bffc2ee96bec8c2b89274a51febcbfa5556.1681210788.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/rsrc.c

index f2c660f..11058e2 100644 (file)
@@ -832,20 +832,14 @@ int __io_scm_file_account(struct io_ring_ctx *ctx, struct file *file)
        return 0;
 }
 
-static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
+static __cold void io_rsrc_file_scm_put(struct io_ring_ctx *ctx, struct file *file)
 {
-       struct file *file = prsrc->file;
 #if defined(CONFIG_UNIX)
        struct sock *sock = ctx->ring_sock->sk;
        struct sk_buff_head list, *head = &sock->sk_receive_queue;
        struct sk_buff *skb;
        int i;
 
-       if (!io_file_need_scm(file)) {
-               fput(file);
-               return;
-       }
-
        __skb_queue_head_init(&list);
 
        /*
@@ -895,11 +889,19 @@ static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
                        __skb_queue_tail(head, skb);
                spin_unlock_irq(&head->lock);
        }
-#else
-       fput(file);
 #endif
 }
 
+static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
+{
+       struct file *file = prsrc->file;
+
+       if (likely(!io_file_need_scm(file)))
+               fput(file);
+       else
+               io_rsrc_file_scm_put(ctx, file);
+}
+
 int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
                          unsigned nr_args, u64 __user *tags)
 {