64 lines
2.2 KiB
Diff
64 lines
2.2 KiB
Diff
|
|
From 8010d3fce008dd13f155bc0babfe236ea44a2712 Mon Sep 17 00:00:00 2001
|
||
|
|
From: "Michael S. Tsirkin" <mst@redhat.com>
|
||
|
|
Date: Fri, 11 Oct 2019 15:58:03 +0200
|
||
|
|
Subject: [PATCH] virtio: new post_load hook
|
||
|
|
|
||
|
|
Post load hook in virtio vmsd is called early while device is processed,
|
||
|
|
and when VirtIODevice core isn't fully initialized. Most device
|
||
|
|
specific code isn't ready to deal with a device in such state, and
|
||
|
|
behaves weirdly.
|
||
|
|
|
||
|
|
Add a new post_load hook in a device class instead. Devices should use
|
||
|
|
this unless they specifically want to verify the migration stream as
|
||
|
|
it's processed, e.g. for bounds checking.
|
||
|
|
|
||
|
|
Cc: qemu-stable@nongnu.org
|
||
|
|
Suggested-by: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
|
||
|
|
Cc: Mikhail Sennikovsky <mikhail.sennikovskii@cloud.ionos.com>
|
||
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||
|
|
(cherry picked from commit 1dd713837cac8ec5a97d3b8492d72ce5ac94803c)
|
||
|
|
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
|
||
|
|
---
|
||
|
|
hw/virtio/virtio.c | 7 +++++++
|
||
|
|
include/hw/virtio/virtio.h | 6 ++++++
|
||
|
|
2 files changed, 13 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
|
||
|
|
index a94ea18a9c..7c3822c3a0 100644
|
||
|
|
--- a/hw/virtio/virtio.c
|
||
|
|
+++ b/hw/virtio/virtio.c
|
||
|
|
@@ -2287,6 +2287,13 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
|
||
|
|
}
|
||
|
|
rcu_read_unlock();
|
||
|
|
|
||
|
|
+ if (vdc->post_load) {
|
||
|
|
+ ret = vdc->post_load(vdev);
|
||
|
|
+ if (ret) {
|
||
|
|
+ return ret;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
|
||
|
|
index b189788cb2..f9f62370e9 100644
|
||
|
|
--- a/include/hw/virtio/virtio.h
|
||
|
|
+++ b/include/hw/virtio/virtio.h
|
||
|
|
@@ -158,6 +158,12 @@ typedef struct VirtioDeviceClass {
|
||
|
|
*/
|
||
|
|
void (*save)(VirtIODevice *vdev, QEMUFile *f);
|
||
|
|
int (*load)(VirtIODevice *vdev, QEMUFile *f, int version_id);
|
||
|
|
+ /* Post load hook in vmsd is called early while device is processed, and
|
||
|
|
+ * when VirtIODevice isn't fully initialized. Devices should use this instead,
|
||
|
|
+ * unless they specifically want to verify the migration stream as it's
|
||
|
|
+ * processed, e.g. for bounds checking.
|
||
|
|
+ */
|
||
|
|
+ int (*post_load)(VirtIODevice *vdev);
|
||
|
|
const VMStateDescription *vmsd;
|
||
|
|
} VirtioDeviceClass;
|
||
|
|
|
||
|
|
--
|
||
|
|
2.23.0
|