summaryrefslogtreecommitdiffstats
path: root/hw/virtio/vhost.c
diff options
context:
space:
mode:
authorMarc-André Lureau2016-07-26 23:15:02 +0200
committerMichael S. Tsirkin2016-07-28 23:33:47 +0200
commite0547b59dc0ead4c605d3f02d1c8829630a1311b (patch)
treeeaf14da0e0754665932125bb44e0351e1073e4cc /hw/virtio/vhost.c
parentvhost: fix cleanup on not fully initialized device (diff)
downloadqemu-e0547b59dc0ead4c605d3f02d1c8829630a1311b.tar.gz
qemu-e0547b59dc0ead4c605d3f02d1c8829630a1311b.tar.xz
qemu-e0547b59dc0ead4c605d3f02d1c8829630a1311b.zip
vhost: make vhost_dev_cleanup() idempotent
It is called on multiple code path, so make it safe to call several times (note: I don't remember a reproducer here, but a function called 'cleanup' should probably be idempotent in my book) Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/virtio/vhost.c')
-rw-r--r--hw/virtio/vhost.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 6b988e1478..9400b47e10 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1123,6 +1123,7 @@ fail:
void vhost_dev_cleanup(struct vhost_dev *hdev)
{
int i;
+
for (i = 0; i < hdev->nvqs; ++i) {
vhost_virtqueue_cleanup(hdev->vqs + i);
}
@@ -1137,8 +1138,12 @@ void vhost_dev_cleanup(struct vhost_dev *hdev)
}
g_free(hdev->mem);
g_free(hdev->mem_sections);
- hdev->vhost_ops->vhost_backend_cleanup(hdev);
+ if (hdev->vhost_ops) {
+ hdev->vhost_ops->vhost_backend_cleanup(hdev);
+ }
assert(!hdev->log);
+
+ memset(hdev, 0, sizeof(struct vhost_dev));
}
/* Stop processing guest IO notifications in qemu.