diff options
author | Marc-André Lureau | 2016-07-26 23:15:02 +0200 |
---|---|---|
committer | Michael S. Tsirkin | 2016-07-28 23:33:47 +0200 |
commit | e0547b59dc0ead4c605d3f02d1c8829630a1311b (patch) | |
tree | eaf14da0e0754665932125bb44e0351e1073e4cc /hw/virtio/vhost.c | |
parent | vhost: fix cleanup on not fully initialized device (diff) | |
download | qemu-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.c | 7 |
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. |