]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
io_uring/napi: improve __io_napi_add
authorOlivier Langlois <olivier@trillion01.com>
Sun, 13 Oct 2024 18:28:50 +0000 (14:28 -0400)
committerJens Axboe <axboe@kernel.dk>
Wed, 6 Nov 2024 20:55:38 +0000 (13:55 -0700)
1. move the sock->sk pointer validity test outside the function to
   avoid the function call overhead and to make the function more
   more reusable
2. change its name to __io_napi_add_id to be more precise about it is
   doing
3. return an error code to report errors

Signed-off-by: Olivier Langlois <olivier@trillion01.com>
Link: https://lore.kernel.org/r/d637fa3b437d753c0f4e44ff6a7b5bf2c2611270.1728828877.git.olivier@trillion01.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/napi.c
io_uring/napi.h

index 921de9de8d75397138f352e970b4023a38263030..5e2299e7ff8ee2ad0340c4a7182988eb5c0f7ac9 100644 (file)
@@ -38,22 +38,14 @@ static inline ktime_t net_to_ktime(unsigned long t)
        return ns_to_ktime(t << 10);
 }
 
-void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock)
+int __io_napi_add_id(struct io_ring_ctx *ctx, unsigned int napi_id)
 {
        struct hlist_head *hash_list;
-       unsigned int napi_id;
-       struct sock *sk;
        struct io_napi_entry *e;
 
-       sk = sock->sk;
-       if (!sk)
-               return;
-
-       napi_id = READ_ONCE(sk->sk_napi_id);
-
        /* Non-NAPI IDs can be rejected. */
        if (napi_id < MIN_NAPI_ID)
-               return;
+               return -EINVAL;
 
        hash_list = &ctx->napi_ht[hash_min(napi_id, HASH_BITS(ctx->napi_ht))];
 
@@ -62,13 +54,13 @@ void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock)
        if (e) {
                WRITE_ONCE(e->timeout, jiffies + NAPI_TIMEOUT);
                rcu_read_unlock();
-               return;
+               return -EEXIST;
        }
        rcu_read_unlock();
 
        e = kmalloc(sizeof(*e), GFP_NOWAIT);
        if (!e)
-               return;
+               return -ENOMEM;
 
        e->napi_id = napi_id;
        e->timeout = jiffies + NAPI_TIMEOUT;
@@ -77,12 +69,13 @@ void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock)
        if (unlikely(io_napi_hash_find(hash_list, napi_id))) {
                spin_unlock(&ctx->napi_lock);
                kfree(e);
-               return;
+               return -EEXIST;
        }
 
        hlist_add_tail_rcu(&e->node, hash_list);
        list_add_tail_rcu(&e->list, &ctx->napi_list);
        spin_unlock(&ctx->napi_lock);
+       return 0;
 }
 
 static void __io_napi_remove_stale(struct io_ring_ctx *ctx)
index fd275ef0456d1a68bef0110acf618e49aac71cdb..4ae622f37b302b859102cee303c30aca19aa34d7 100644 (file)
@@ -15,7 +15,7 @@ void io_napi_free(struct io_ring_ctx *ctx);
 int io_register_napi(struct io_ring_ctx *ctx, void __user *arg);
 int io_unregister_napi(struct io_ring_ctx *ctx, void __user *arg);
 
-void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock);
+int __io_napi_add_id(struct io_ring_ctx *ctx, unsigned int napi_id);
 
 void __io_napi_busy_loop(struct io_ring_ctx *ctx, struct io_wait_queue *iowq);
 int io_napi_sqpoll_busy_poll(struct io_ring_ctx *ctx);
@@ -48,8 +48,8 @@ static inline void io_napi_add(struct io_kiocb *req)
                return;
 
        sock = sock_from_file(req->file);
-       if (sock)
-               __io_napi_add(ctx, sock);
+       if (sock && sock->sk)
+               __io_napi_add_id(ctx, READ_ONCE(sock->sk->sk_napi_id));
 }
 
 #else