If device thinks that it isn't necessary to apply coroutine in its performance sensitive path, it can call block_set_bypass_co(false) to bypass the coroutine and just call the function directly in the aio read/write path.
One example is virtio-blk dataplane. Signed-off-by: Ming Lei <ming....@canonical.com> --- block.c | 10 ++++++++++ include/block/block.h | 3 +++ include/block/block_int.h | 3 +++ 3 files changed, 16 insertions(+) diff --git a/block.c b/block.c index 8cf519b..ac184ef 100644 --- a/block.c +++ b/block.c @@ -5840,3 +5840,13 @@ void bdrv_flush_io_queue(BlockDriverState *bs) bdrv_flush_io_queue(bs->file); } } + +void bdrv_set_bypass_co(BlockDriverState *bs, bool bypass) +{ + bs->bypass_co = bypass; +} + +bool bdrv_get_bypass_co(BlockDriverState *bs) +{ + return bs->bypass_co; +} diff --git a/include/block/block.h b/include/block/block.h index f08471d..92f2f3a 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -588,4 +588,7 @@ void bdrv_io_plug(BlockDriverState *bs); void bdrv_io_unplug(BlockDriverState *bs); void bdrv_flush_io_queue(BlockDriverState *bs); +void bdrv_set_bypass_co(BlockDriverState *bs, bool bypass); +bool bdrv_get_bypass_co(BlockDriverState *bs); + #endif diff --git a/include/block/block_int.h b/include/block/block_int.h index 7b541a0..9fa2f4c 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -354,6 +354,9 @@ struct BlockDriverState { /* Whether produces zeros when read beyond eof */ bool zero_beyond_eof; + /* Whether bypasses coroutine when doing aio read & write */ + bool bypass_co; + /* Alignment requirement for offset/length of I/O requests */ unsigned int request_alignment; -- 1.7.9.5