Message ID | 20170517170941.25850-2-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
On 05/17/2017 12:09 PM, Stefan Hajnoczi wrote: > Call bdrv_inc/dec_in_flight() for vmstate reads/writes. This seems > unnecessary at first glance because vmstate reads/writes are done > synchronously while the guest is stopped. But we need the bdrv_wakeup() > in bdrv_dec_in_flight() so the main loop sees request completion. > Besides, it's cleaner to count vmstate reads/writes like ordinary > read/write requests. > > The bdrv_wakeup() partially fixes a 'savevm' hang with -object iothread. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > block/io.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) Reviewed-by: Eric Blake <eblake@redhat.com>
diff --git a/block/io.c b/block/io.c index fdd7485..cc56e90 100644 --- a/block/io.c +++ b/block/io.c @@ -1988,17 +1988,24 @@ bdrv_co_rw_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos, bool is_read) { BlockDriver *drv = bs->drv; + int ret = -ENOTSUP; + + bdrv_inc_in_flight(bs); if (!drv) { - return -ENOMEDIUM; + ret = -ENOMEDIUM; } else if (drv->bdrv_load_vmstate) { - return is_read ? drv->bdrv_load_vmstate(bs, qiov, pos) - : drv->bdrv_save_vmstate(bs, qiov, pos); + if (is_read) { + ret = drv->bdrv_load_vmstate(bs, qiov, pos); + } else { + ret = drv->bdrv_save_vmstate(bs, qiov, pos); + } } else if (bs->file) { - return bdrv_co_rw_vmstate(bs->file->bs, qiov, pos, is_read); + ret = bdrv_co_rw_vmstate(bs->file->bs, qiov, pos, is_read); } - return -ENOTSUP; + bdrv_dec_in_flight(bs); + return ret; } static void coroutine_fn bdrv_co_rw_vmstate_entry(void *opaque)
Call bdrv_inc/dec_in_flight() for vmstate reads/writes. This seems unnecessary at first glance because vmstate reads/writes are done synchronously while the guest is stopped. But we need the bdrv_wakeup() in bdrv_dec_in_flight() so the main loop sees request completion. Besides, it's cleaner to count vmstate reads/writes like ordinary read/write requests. The bdrv_wakeup() partially fixes a 'savevm' hang with -object iothread. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- block/io.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)