io_uring: allow defer completion for aux posted cqes
authorDylan Yudaken <dylany@meta.com>
Thu, 24 Nov 2022 09:35:54 +0000 (01:35 -0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 25 Nov 2022 13:10:04 +0000 (06:10 -0700)
commit931147ddfa6e9ffd814272f1c0370c4740acbe17
treeb4eb11cbb2cbe60eb47828100a64b62da31ea25d
parent973fc83f3a94bdffcacf482641db38f57c7c8609
io_uring: allow defer completion for aux posted cqes

Multishot ops cannot use the compl_reqs list as the request must stay in
the poll list, but that means they need to run each completion without
benefiting from batching.

Here introduce batching infrastructure for only small (ie 16 byte)
CQEs. This restriction is ok because there are no use cases posting 32
byte CQEs.

In the ring keep a batch of up to 16 posted results, and flush in the same
way as compl_reqs.

16 was chosen through experimentation on a microbenchmark ([1]), as well
as trying not to increase the size of the ring too much. This increases
the size to 1472 bytes from 1216.

[1]: https://github.com/DylanZA/liburing/commit/9ac66b36bcf4477bfafeff1c5f107896b7ae31cf
Run with $ make -j && ./benchmark/reg.b -s 1 -t 2000 -r 10
Gives results:
baseline 8309 k/s
8 18807 k/s
16 19338 k/s
32 20134 k/s

Suggested-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Dylan Yudaken <dylany@meta.com>
Link: https://lore.kernel.org/r/20221124093559.3780686-5-dylany@meta.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/io_uring_types.h
io_uring/io_uring.c