Hi Jens, Peters recent inquiry made me dust off various bits of unfinished work around blk_mq_complete_request and massage it into a coherent series. This does three different things all touching the same area: - merge the softirq based single queue completion into the main blk-mq completion mechanism, as there is a lot of duplicate logic between the two - move the error injection that just fails to complete requests out into the drivers. The fact that blk_mq_complete_request just wouldn't complete when called from the error handle has been causing all kinds of pain - optimize the fast path by allowing drivers to avoid the indirect call with a little more work for polled or per-CPU IRQ completions. With this a polled block device I/O only has two indirect calls let, one for the file operation that ends up in the block device code, and another one for disptching to the nvme driver