block: count bdrv_co_rw_vmstate() requests

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>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2017-05-22 14:57:01 +01:00 committed by Kevin Wolf
parent 24575bfa8c
commit dc88a467ec

View File

@ -1980,17 +1980,24 @@ bdrv_co_rw_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos,
bool is_read) bool is_read)
{ {
BlockDriver *drv = bs->drv; BlockDriver *drv = bs->drv;
int ret = -ENOTSUP;
bdrv_inc_in_flight(bs);
if (!drv) { if (!drv) {
return -ENOMEDIUM; ret = -ENOMEDIUM;
} else if (drv->bdrv_load_vmstate) { } else if (drv->bdrv_load_vmstate) {
return is_read ? drv->bdrv_load_vmstate(bs, qiov, pos) if (is_read) {
: drv->bdrv_save_vmstate(bs, qiov, pos); ret = drv->bdrv_load_vmstate(bs, qiov, pos);
} else {
ret = drv->bdrv_save_vmstate(bs, qiov, pos);
}
} else if (bs->file) { } 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) static void coroutine_fn bdrv_co_rw_vmstate_entry(void *opaque)