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:
parent
24575bfa8c
commit
dc88a467ec
17
block/io.c
17
block/io.c
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user