Jens Axboe <axboe@xxxxxxxxx> writes: > On 5/18/23 3:17?PM, Stefan Roesch wrote: >> diff --git a/io_uring/poll.c b/io_uring/poll.c >> index c90e47dc1e29..0284849793bb 100644 >> --- a/io_uring/poll.c >> +++ b/io_uring/poll.c >> @@ -15,6 +15,7 @@ >> >> #include "io_uring.h" >> #include "refs.h" >> +#include "napi.h" >> #include "opdef.h" >> #include "kbuf.h" >> #include "poll.h" >> @@ -631,6 +632,7 @@ static int __io_arm_poll_handler(struct io_kiocb *req, >> __io_poll_execute(req, mask); >> return 0; >> } >> + io_napi_add(req); >> >> if (ipt->owning) { >> /* > > One thing that bothers me a bit here is that we then do: > > static inline void io_napi_add(struct io_kiocb *req) > { > struct io_ring_ctx *ctx = req->ctx; > > if (!READ_ONCE(ctx->napi_busy_poll_to)) > return; > > __io_napi_add(ctx, req->file); > } > > which will do __io_napi_add() for any file type, even though we really > just want sockets here. I initially thought we could add a fast flag for > the type (like we do for IS_REG), but I think we can just do this > incremental and call it good enough. > > Unfortunately sock_from_file() is also a function call... But not a huge > problem. > > > diff --git a/io_uring/napi.c b/io_uring/napi.c > index 5790b2daf1d0..8ec016899539 100644 > --- a/io_uring/napi.c > +++ b/io_uring/napi.c > @@ -33,18 +33,13 @@ static struct io_napi_entry *io_napi_hash_find(struct hlist_head *hash_list, > return NULL; > } > > -void __io_napi_add(struct io_ring_ctx *ctx, struct file *file) > +void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock) > { > struct hlist_head *hash_list; > unsigned int napi_id; > - struct socket *sock; > struct sock *sk; > struct io_napi_entry *e; > > - sock = sock_from_file(file); > - if (!sock) > - return; > - > sk = sock->sk; > if (!sk) > return; > diff --git a/io_uring/napi.h b/io_uring/napi.h > index 69c1970cbecc..08cee8f4c9d1 100644 > --- a/io_uring/napi.h > +++ b/io_uring/napi.h > @@ -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 file *file); > +void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock); > > void __io_napi_adjust_timeout(struct io_ring_ctx *ctx, > struct io_wait_queue *iowq, struct timespec64 *ts); > @@ -53,46 +53,51 @@ static inline void io_napi_busy_loop(struct io_ring_ctx *ctx, > static inline void io_napi_add(struct io_kiocb *req) > { > struct io_ring_ctx *ctx = req->ctx; > + struct socket *sock; > > if (!READ_ONCE(ctx->napi_busy_poll_to)) > return; > > - __io_napi_add(ctx, req->file); > + sock = sock_from_file(req->file); > + if (sock) > + __io_napi_add(ctx, sock); > } I'll add the above changes to the next version.