qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH v2 2/3] virtio: introduce 'missing_features_migrated' device


From: Yuri Benditovich
Subject: [RFC PATCH v2 2/3] virtio: introduce 'missing_features_migrated' device callback
Date: Mon, 22 Mar 2021 14:24:51 +0200

This optional callback addresses migration problem in case
some of negotiated features not present on the destination
system. The device has a chance to avoid migration failure.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
---
 hw/virtio/virtio.c         | 8 ++++++++
 include/hw/virtio/virtio.h | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 07f4e60b30..36dcac75e5 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -3107,6 +3107,14 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int 
version_id)
         vdev->device_endian = virtio_default_endian();
     }
 
+    if (vdc->missing_features_migrated) {
+        uint64_t missing = (vdev->guest_features & ~(vdev->host_features));
+        if (missing && vdc->missing_features_migrated(vdev, missing)) {
+            vdev->host_features =
+                vdc->get_features(vdev, vdev->host_features, NULL);
+        }
+    }
+
     if (virtio_64bit_features_needed(vdev)) {
         /*
          * Subsection load filled vdev->guest_features.  Run them
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index b7ece7a6a8..fbfbec6ef2 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -158,6 +158,14 @@ struct VirtioDeviceClass {
      * processed, e.g. for bounds checking.
      */
     int (*post_load)(VirtIODevice *vdev);
+    /* In case when some of negotiated features are missing on the destination
+       system, the migration is expected to fail. To avoid such failure, the
+       device may implement this callback and apply graceful configuration
+       change to extend host features (for example, disable vhost).
+       If the device returns true the virtio reinitializes the host features
+       and further set_features call may succeed.
+     */
+    bool (*missing_features_migrated)(VirtIODevice *vdev, uint64_t val);
     const VMStateDescription *vmsd;
     bool (*primary_unplug_pending)(void *opaque);
 };
-- 
2.26.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]