Hi Stefan, I've tested the code and it behaves as you expected. Should I add this to a new patch version or leave it as is?
Sam Stefan Hajnoczi <stefa...@gmail.com> 于2022年4月22日周五 23:10写道: > On Fri, Apr 22, 2022 at 12:36:49AM +0800, Sam Li wrote: > > Linux recently added a new io_uring(7) optimization API that QEMU > > doesn't take advantage of yet. The liburing library that QEMU uses > > has added a corresponding new API calling io_uring_register_ring_fd(). > > When this API is called after creating the ring, the io_uring_submit() > > library function passes a flag to the io_uring_enter(2) syscall > > allowing it to skip the ring file descriptor fdget()/fdput() > > operations. This saves some CPU cycles. > > > > Signed-off-by: Sam Li <faithilike...@gmail.com> > > --- > > block/io_uring.c | 10 +++++++++- > > 1 file changed, 9 insertions(+), 1 deletion(-) > > > > diff --git a/block/io_uring.c b/block/io_uring.c > > index 782afdb433..5247fb79e2 100644 > > --- a/block/io_uring.c > > +++ b/block/io_uring.c > > @@ -435,8 +435,16 @@ LuringState *luring_init(Error **errp) > > } > > > > ioq_init(&s->io_q); > > - return s; > > + if (io_uring_register_ring_fd(&s->ring) < 0) { > > What happens when QEMU is built against an older version of liburing > that lacks the io_uring_register_ring_fd() API? > > I guess there will be a compiler error because the function prototype is > missing in <liburing.h>. > > This can be addressed by checking for the presence of the function in > meson.build: > > +config_host_data.set('CONFIG_LIBURING_REGISTER_RING_FD', > cc.has_function('io_uring_register_ring_fd', prefix: '#include > <liburing.h>')) > > Then block/io_uring.c can call the function only when available: > > +#ifdef CONFIG_LIBURING_REGISTER_RING_FD > + io_uring_register_ring_fd(&s->ring); > +#endif > > (I haven't tested this code but it should be close.) > > Stefan >