Prepare for future backend-transfer migration of vhost-user-blk.
Among other things we'll need to transfer the inflight region, let's
prepare for this.

Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
 hw/virtio/vhost.c         | 26 ++++++++++++++++++++++++++
 include/hw/virtio/vhost.h |  5 +++++
 2 files changed, 31 insertions(+)

diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 3e5192ec23..63036f8214 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1975,6 +1975,32 @@ void vhost_get_features_ex(struct vhost_dev *hdev,
     }
 }
 
+static int vhost_inflight_backend_transfer_post_load(void *opaque,
+                                                     int version_id)
+{
+    struct vhost_inflight *inflight = opaque;
+
+    inflight->addr = mmap(0, inflight->size, PROT_READ | PROT_WRITE,
+                             MAP_SHARED, inflight->fd, inflight->offset);
+    if (inflight->addr == MAP_FAILED) {
+        return -EINVAL;
+    }
+
+    return 0;
+}
+
+const VMStateDescription vmstate_backend_transfer_vhost_inflight = {
+    .name = "vhost-inflight",
+    .post_load = vhost_inflight_backend_transfer_post_load,
+    .fields = (const VMStateField[]) {
+        VMSTATE_FD(fd, struct vhost_inflight),
+        VMSTATE_UINT64(size, struct vhost_inflight),
+        VMSTATE_UINT64(offset, struct vhost_inflight),
+        VMSTATE_UINT16(queue_size, struct vhost_inflight),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 void vhost_ack_features_ex(struct vhost_dev *hdev, const int *feature_bits,
                            const uint64_t *features)
 {
diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
index af46d4b5f2..94a0c75fc8 100644
--- a/include/hw/virtio/vhost.h
+++ b/include/hw/virtio/vhost.h
@@ -587,4 +587,9 @@ static inline int vhost_load_backend_state(struct vhost_dev 
*dev, QEMUFile *f,
 }
 #endif
 
+extern const VMStateDescription vmstate_backend_transfer_vhost_inflight;
+#define VMSTATE_BACKEND_TRANSFER_VHOST_INFLIGHT(_field, _state) \
+    VMSTATE_STRUCT_POINTER(_field, _state, vmstate_inflight, \
+                           struct vhost_inflight)
+
 #endif
-- 
2.48.1


Reply via email to