Taking a blktrace of a simple fio run on a block device file using libaio and iodepth > 1 reveals that asynchronous writes are executed as sync writes, that is, REQ_SYNC is set for the write BIOs. Fix this by modifying dio_bio_write_op() to set REQ_SYNC only for IOs that are indeed synchronous ones and set REQ_IDLE only for asynchronous IOs. Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> --- block/fops.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/block/fops.c b/block/fops.c index 50d245e8c913..5a4f57726828 100644 --- a/block/fops.c +++ b/block/fops.c @@ -34,7 +34,12 @@ static int blkdev_get_block(struct inode *inode, sector_t iblock, static blk_opf_t dio_bio_write_op(struct kiocb *iocb) { - blk_opf_t opf = REQ_OP_WRITE | REQ_SYNC | REQ_IDLE; + blk_opf_t opf = REQ_OP_WRITE; + + if (is_sync_kiocb(iocb)) + opf |= REQ_SYNC; + else + opf |= REQ_IDLE; /* avoid the need for a I/O completion work item */ if (iocb_is_dsync(iocb)) -- 2.38.1