Message ID | 1444650651-26227-11-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
Am 12.10.2015 um 13:50 hat Fam Zheng geschrieben: > Drivers can have internal request sources that generate IO, like the > need_check_timer in QED. Since we want quiesced periods that contain > nested event loops in block layer, we need to have a way to disable such > event sources. > > Block drivers must implement the "bdrv_drain" callback if it has any > internal sources that can generate I/O activity, like a timer or a > worker thread (even in a library) that can schedule QEMUBH in an > asynchronous callback. > > Signed-off-by: Fam Zheng <famz@redhat.com> I think the right interface would be .bdrv_drain_begin/end callbacks so that the timers or background work can be reenabled again after the drained section. As it happens, QED doesn't need this because you chose to complete the outstanding work and the timer only needs to be reenabled on the next write operation. Fine with me, we can extend the interface as soon as we really need it. (Though, actually, I'm not sure... I think I'll comment on the QED patch.) Kevin
diff --git a/block/io.c b/block/io.c index 5c088d5..0e6d77c 100644 --- a/block/io.c +++ b/block/io.c @@ -247,6 +247,9 @@ void bdrv_drain(BlockDriverState *bs) { bool busy = true; + if (bs->drv && bs->drv->bdrv_drain) { + bs->drv->bdrv_drain(bs); + } while (busy) { /* Keep iterating */ bdrv_flush_io_queue(bs); diff --git a/include/block/block_int.h b/include/block/block_int.h index 7c58221..99359b2 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -288,6 +288,12 @@ struct BlockDriver { */ int (*bdrv_probe_geometry)(BlockDriverState *bs, HDGeometry *geo); + /** + * Drain and stop any internal sources of requests in the driver, and + * remain so until next I/O callback (e.g. bdrv_co_writev) is called. + */ + void (*bdrv_drain)(BlockDriverState *bs); + QLIST_ENTRY(BlockDriver) list; };
Drivers can have internal request sources that generate IO, like the need_check_timer in QED. Since we want quiesced periods that contain nested event loops in block layer, we need to have a way to disable such event sources. Block drivers must implement the "bdrv_drain" callback if it has any internal sources that can generate I/O activity, like a timer or a worker thread (even in a library) that can schedule QEMUBH in an asynchronous callback. Signed-off-by: Fam Zheng <famz@redhat.com> --- block/io.c | 3 +++ include/block/block_int.h | 6 ++++++ 2 files changed, 9 insertions(+)