On 10/14/2011 01:08 PM, Kevin Wolf wrote:
Am 14.10.2011 10:41, schrieb Paolo Bonzini:
Add coroutine support for flush and apply the same emulation that
we already do for read/write. bdrv_aio_flush is simplified to always
go through a coroutine.
Signed-off-by: Paolo Bonzini<pbonz...@redhat.com>
To make the implementation more consistent with read/write operations,
wouldn't it make sense to provide a bdrv_co_flush() globally instead of
using the synchronous version as the preferred public interface?
I thought about it, but then it turned out that I would have
bdrv_flush
-> create coroutine or just fast-path to bdrv_flush_co_entry
-> bdrv_flush_co_entry
-> driver
and
bdrv_co_flush
-> bdrv_flush_co_entry
-> driver
In other words, the code would be exactly the same, save for an "if
(qemu_in_coroutine())". The reason is that, unlike read/write, neither
flush nor discard take a qiov.
In general, I think that with Stefan's cleanup having specialized
coroutine versions has in general a much smaller benefit. The code
reading benefit of naming routines like bdrv_co_* is already lost, for
example, since bdrv_read can yield when called for coroutine context.
Let me show how this might go. Right now you have
bdrv_read/write
-> bdrv_rw_co
-> create qiov
-> create coroutine or just fast-path to bdrv_rw_co_entry
-> bdrv_rw_co_entry
-> bdrv_co_do_readv/writev
-> driver
bdrv_co_readv/writev
-> bdrv_co_do_readv/writev
-> driver
But starting from here, you might just as well reorganize it like this:
bdrv_read/writev
-> bdrv_rw_co
-> create qiov
-> bdrv_readv/writev
bdrv_readv/writev
-> create coroutine or just fast-path to bdrv_rw_co_entry
-> bdrv_rw_co_entry
-> bdrv_co_do_readv/writev
-> driver
and just drop bdrv_co_readv, since it would just be hard-coding the
fast-path of bdrv_readv.
Since some amount of synchronous I/O would likely always be there, for
example in qemu-img, I think this unification would make more sense than
providing two separate entrypoints for bdrv_co_flush and bdrv_flush.
Paolo