mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
io_uring/napi: improve __io_napi_add
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>
This commit is contained in:
parent
45b3941d09
commit
a5e26f49fe
@ -38,22 +38,14 @@ static inline ktime_t net_to_ktime(unsigned long t)
|
|||||||
return ns_to_ktime(t << 10);
|
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;
|
struct hlist_head *hash_list;
|
||||||
unsigned int napi_id;
|
|
||||||
struct sock *sk;
|
|
||||||
struct io_napi_entry *e;
|
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. */
|
/* Non-NAPI IDs can be rejected. */
|
||||||
if (napi_id < MIN_NAPI_ID)
|
if (napi_id < MIN_NAPI_ID)
|
||||||
return;
|
return -EINVAL;
|
||||||
|
|
||||||
hash_list = &ctx->napi_ht[hash_min(napi_id, HASH_BITS(ctx->napi_ht))];
|
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) {
|
if (e) {
|
||||||
WRITE_ONCE(e->timeout, jiffies + NAPI_TIMEOUT);
|
WRITE_ONCE(e->timeout, jiffies + NAPI_TIMEOUT);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
return;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
e = kmalloc(sizeof(*e), GFP_NOWAIT);
|
e = kmalloc(sizeof(*e), GFP_NOWAIT);
|
||||||
if (!e)
|
if (!e)
|
||||||
return;
|
return -ENOMEM;
|
||||||
|
|
||||||
e->napi_id = napi_id;
|
e->napi_id = napi_id;
|
||||||
e->timeout = jiffies + NAPI_TIMEOUT;
|
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))) {
|
if (unlikely(io_napi_hash_find(hash_list, napi_id))) {
|
||||||
spin_unlock(&ctx->napi_lock);
|
spin_unlock(&ctx->napi_lock);
|
||||||
kfree(e);
|
kfree(e);
|
||||||
return;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
hlist_add_tail_rcu(&e->node, hash_list);
|
hlist_add_tail_rcu(&e->node, hash_list);
|
||||||
list_add_tail_rcu(&e->list, &ctx->napi_list);
|
list_add_tail_rcu(&e->list, &ctx->napi_list);
|
||||||
spin_unlock(&ctx->napi_lock);
|
spin_unlock(&ctx->napi_lock);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __io_napi_remove_stale(struct io_ring_ctx *ctx)
|
static void __io_napi_remove_stale(struct io_ring_ctx *ctx)
|
||||||
|
@ -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_register_napi(struct io_ring_ctx *ctx, void __user *arg);
|
||||||
int io_unregister_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);
|
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);
|
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;
|
return;
|
||||||
|
|
||||||
sock = sock_from_file(req->file);
|
sock = sock_from_file(req->file);
|
||||||
if (sock)
|
if (sock && sock->sk)
|
||||||
__io_napi_add(ctx, sock);
|
__io_napi_add_id(ctx, READ_ONCE(sock->sk->sk_napi_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user