Hi, 1/2 are really just optimizations, but were done with the support for using cached bio allocations with IRQ driven IO. The bio recycling is an even bigger win on IRQ driven IO than it was on polling, around a 13% improvement for me. A caller that is prepared to get a bio passed back at completion time may set IOCB_BIO_PASSBACK in the iocb, and then the completion side may notice this and assign iocb->private and set IOCB_PRIV_IS_BIO and have ->ki_complete() handle the freeing. This works for io_uring as IRQ completions are processed in task context. -- Jens Axboe